一. 绑定目标
将一个 WPF 的 TextBlock 与一个类的一个 int 类型静态字段 Number 进行绑定,并且在这个 Number 为奇数的时候,在 TextBlock 中显示奇数,偶数的时候显示偶数。
二. 绑定思路
绑定的过程:
1. 新建一个类命名为 DemoClass,并在这个类中增加一个静态字段 Number,代码如下:
public class DemoClass { private int _number = 0; public int Number { get; set; } }
2. 在类中添加如下静态事件
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
并修改 1 中代码,代码如下:
//添加命名空间 using System.ComponentModel; public class DemoClass { /// <summary> /// 为 System.ComponentModel.INotifyPropertyChanged.PropertyChanged 事件提供数据 /// </summary> public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; private static int _number = 0; public static int Number { get { return _number; } set { _number = value; //通知 StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(Number))); } } }
3. 添加一个转换器,代码如下(这不是绑定必须的代码):
//添加命名空间 using System.Globalization; using System.Windows.Data; /// <summary> /// 将数值输出为奇偶数 /// </summary> public class OddAndEvenJudgeConverter : IValueConverter { /// <summary> /// 转换器 /// </summary> public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { //判断数据是否错误 if(value == null || !(value is int)) { return "数据错误"; } if ((int)value % 2 == 0) { return "偶数"; } else { return "奇数"; } } /// <summary> /// 不用管 /// </summary> public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
4. 添加 WPF 的 xaml 代码中加入 TextBlock 和资源字典,代码如下:
资源字典 xaml 代码:
<Window.Resources> <local:DemoClass x:Key="demoClass"/> <local:OddAndEvenJudgeConverter x:Key="oddAndEvenJudgeConverter"/> </Window.Resources>
注:在刚写完之后会出现 " 命名空间 clr-namespace:XXX 中不存在 XXX 名称 ",只需要进行编译之后就不会出现这个提示
TextBlock 的 xaml 代码:
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40" Text="{Binding Source={StaticResource demoClass},Path=Number,Converter={StaticResource oddAndEvenJudgeConverter}}"/>
此时的 WPF 设计器的显示为下图
6. 在类中 DemoClass 增加一个随机数触发 Timer,用于修改后台的 Number 的值,代码如下:
//添加命名空间 using System.Timers; //DemoClass类中增加: /// <summary> /// 用来在后台修改 Number 的数值 /// </summary> private static Timer timer = null; /// <summary> /// 随机数产生器 /// </summary> private static Random random = new Random(); static DemoClass() { timer = new Timer(2000); timer.Elapsed += (o, e) => { Number = random.Next(0, 100); }; timer.Start(); }
可以看到运行结果为中间的文字在 "奇数" 和 "偶数" 之间不断的转换。