自定义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); }
}
...全文
1221 7 打赏 收藏 转发到动态 举报
写回复
用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 就可以了,前提是你的依赖属性要注册正确先。
SQL实战进阶完整课程资源,面向已经掌握SELECT、INSERT、UPDATE、DELETE等基础语法,希望进一步提升复杂SQL编写、业务数据分析和数据库性能优化能力的学习者。 课程以MySQL 8+为主要实战环境,从真实业务问题出发,由浅入深讲解多表JOIN、GROUP BY复杂聚合、子查询、EXISTS、CTE公共表表达式、窗口函数、TopN排名、累计统计、环比分析、移动平均、用户留存、转化漏斗等常见进阶SQL场景。 性能优化部分详细讲解B+Tree索引原理、单列索引、联合索引、最左前缀、覆盖索引、回表、ORDER BY排序优化、EXPLAIN执行计划、EXPLAIN ANALYZE、慢SQL定位与改写、深分页优化、事务、隔离级别、锁等待及常见并发问题。 资源包含完整课程文档、13张SQL原理图解、可直接执行的MySQL建表与初始化数据、多个业务案例SQL、Docker Compose本地学习环境、大数据量测试脚本、52道SQL进阶练习题及详细答案,并提供完整电商订单经营分析综合项目。 课程重点不是简单堆SQL语法,而是讲清楚每条SQL为什么这样写、JOIN后为什么会重复统计、索引为什么有效、SQL为什么变慢、如何阅读执行计划以及如何验证优化效果。 适合Java/Go/Python/PHP后端开发、数据库学习、数据分析、SQL进阶、MySQL性能优化、面试复习以及实际项目开发使用。

8,757

社区成员

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

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