WPF 如何绑定静态字段


一. 绑定目标

将一个 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();
}

可以看到运行结果为中间的文字在 "奇数" 和 "偶数" 之间不断的转换。

三. 运行的结果

四. 项目工程

下载地址


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM