自定义TextBox,右侧带单位(如cm,kg)

51Crack 2015-09-18 11:22:07
效果:

修改模板已经实现

<UserControl.Resources>
<Style>
...
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<TextBlock Grid.Column="1" Margin="0,0,1,0" Text="cm" Foreground="Gray"/>
</Grid>
</Themes:ListBoxChrome>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
...
</Style>
</UserControl.Resources>

<Grid>
<TextBox Name="txt" Style="{DynamicResource TextBoxStyle1}"/>
</Grid>


现在想做成通用控件,比如cm处能换成kg、ml...
请教模板中的子控件TextBlock的Text要怎么绑定ViewModel中的属性CM/KG?MVVM

已自定义属性
public static readonly DependencyProperty UnitNameProperty = DependencyProperty.Register("UnitName", typeof(string), typeof(TextBoxWithUnit), new PropertyMetadata("cm"));
public string UnitName
{
get { return GetValue(UnitNameProperty).ToString(); }
set { SetValue(UnitNameProperty, value); }
}
...全文
1115 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
51Crack 2015-09-18
  • 打赏
  • 举报
回复
或者
public static readonly DependencyProperty UnitNameProperty = DependencyProperty.Register("UnitName", typeof(string), typeof(TextBoxWithUnit), new PropertyMetadata("", new PropertyChangedCallback(OnPropertyChanged_UnitName)));
在OnPropertyChanged_UnitName中能赋值也行
51Crack 2015-09-18
  • 打赏
  • 举报
回复
引用 6 楼 xhtmldivcss 的回复:
[quote=引用 5 楼 51Crack 的回复:] 是这个意思,但方法不行
如果要这样子用UnitName,那应该是定义一个自定义控件(custom control),而不是用户控件(user control)吧? 然后在custom control的控件类里定义UnitName这个DP。[/quote] 可以了,多谢
xhtmldivcss 2015-09-18
  • 打赏
  • 举报
回复
引用 5 楼 51Crack 的回复:
是这个意思,但方法不行
如果要这样子用UnitName,那应该是定义一个自定义控件(custom control),而不是用户控件(user control)吧? 然后在custom control的控件类里定义UnitName这个DP。
51Crack 2015-09-18
  • 打赏
  • 举报
回复
引用 4 楼 xhtmldivcss 的回复:
没做过类似的,不过既然都已经注册了UnitName这个DP,那在控件模版的
<TextBlock Grid.Column="1" Margin="0,0,1,0" Text="{TemplateBinding UnitName}" Foreground="Gray"/>
那引用控件时不就可以指定UnitName了吗?

如果考虑MVVM,那VM绑定UnitName,提供值不就得了吗?

是这个意思,但方法不行

xhtmldivcss 2015-09-18
  • 打赏
  • 举报
回复
没做过类似的,不过既然都已经注册了UnitName这个DP,那在控件模版的 <TextBlock Grid.Column="1" Margin="0,0,1,0" Text="{TemplateBinding UnitName}" Foreground="Gray"/> 那引用控件时不就可以指定UnitName了吗? 如果考虑MVVM,那VM绑定UnitName,提供值不就得了吗?
51Crack 2015-09-18
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
在引用用户控件的 页面上 直接绑定你的 UnitName 就可以了,前提是你的依赖属性要注册正确先。
如果TextBlock的Text直接绑定ViewModel中的属性可以实现,但这样就绑死了,界面上2个控件,一个设置为cm,一个设置为kg TextBlock怎么跟UnitName绑定或赋值?
  • 打赏
  • 举报
回复
在引用用户控件的 页面上 直接绑定你的 UnitName 就可以了,前提是你的依赖属性要注册正确先。

8,756

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧