WPF Binding设计的感悟
Binding设计的设计一般包含三个部分
1 源数据的设计,目的是通过改变源数据,将数据的变化直接映射到界面
//------------------------------第一个部分(事件定义)
// 实现动态绑定
public event PropertyChangedEventHandler PropertyChanged;
// 自定义事件触发函数!
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
//------------------------------第二个部分(属性定义)
public Dictionary<ushort, ushort> dic_reg_data = new Dictionary<ushort, ushort>();
public Dictionary<ushort, ushort> DicRegData
{
get => dic_reg_data;
// 仅仅修改字典的某个值,无法触发set,如: DicData[addr] = value
set
{
dic_reg_data = value;
// 一般传递的参数是propertyName,如果传递空字符串,wpf会通知所有绑定属性!
//后台数据发生变化时,前台数据可以跟着发生变化!
OnPropertyChanged(new PropertyChangedEventArgs("DicRegData"));
}
}
2 目标设计,一般是控件的某个依赖属性,我们往往自定义控件的时候,就会创建依赖属性,让后将该属性绑定到上面的定义的数据源。这里我自定义两个依赖属性
/// <summary>
/// 内容显示
/// </summary>
public static DependencyProperty NameShowProperty =
DependencyProperty.Register("NameShow", typeof(string), typeof(MBit), new PropertyMetadata("预留"));
public string NameShow
{
get { return (string)GetValue(NameShowProperty); }
set { SetValue(NameShowProperty, value); }
}
/// <summary>
/// 该属性配合一个转换器,显示颜色
/// </summary>
public static DependencyProperty BoolColorProperty =
DependencyProperty.Register("BoolColor", typeof(bool), typeof(MBit), new PropertyMetadata(false));
public bool BoolColor
{
get { return (bool)GetValue(BoolColorProperty); }
set { SetValue(BoolColorProperty, value); }
}
3 转换器,有的数据不能直接映射到界面,此时就可以通过转换器,将源数据的格式转换后再映射到界面
/// <summary>
/// bool转颜色 true:红色 false:绿色
/// </summary>
public class Bool2ColorConv : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return new SolidColorBrush(Colors.Red);
}
bool b = (bool)value;
//Console.WriteLine(row_num);
if (b == true)
{
return new SolidColorBrush(Colors.Green);
}
else {
return new SolidColorBrush(Colors.Red);
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
最后加上,xaml中使用转换器的代码
<UserControl x:Class="ModbusCtrlLib.MBit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ModbusCtrlLib"
xmlns:base_conv="clr-namespace:XXXBase.MyConverter;assembly=XXXBase"
mc:Ignorable="d"
d:DesignHeight="25" d:DesignWidth="150"
x:Name="uc"
>
<UserControl.Resources>
<base_conv:Bool2ColorConv x:Key="Bool2ColorConv"/>
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button x:Name="btn_bit" Click="btn_bit_Click" Background="{Binding ElementName=uc, Path=BoolColor, Converter={StaticResource Bool2ColorConv} }">
</Button>
</Grid>
</UserControl>
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现