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>

posted @ 2021-11-02 16:33  宋桓公  阅读(20)  评论(0编辑  收藏  举报