要在 WPF 中实现数据表对应实体的属性与 UI 控件的双向绑定,并支持修改通知和 UI 自动更新

没有通知功能的属性改成有通知功能的属性

复制代码
/// </summary>
[MfTable("Recipe")]
public class RecipeModel : BaseModelExtendIdAndName<int>
{
    /// <summary>
    /// 类型 RecipeTypeEnum
    /// </summary>
    public int Type { get; set; }
} 

要在 WPF 中实现数据表对应实体的属性与 UI 控件的双向绑定,并支持修改通知和 UI 自动更新,需要让模型类实现属性更改通知接口。以下是具体实现步骤:

1. 让模型类实现INotifyPropertyChanged接口

WPF 的绑定机制依赖INotifyPropertyChanged接口来监听属性变化。由于你的RecipeModel继承自BaseModelExtendIdAndName<int>,建议在基类中实现该接口(若基类未实现),或在子类中扩展实现。

增加一个类 BaseModelExtendIdAndNameNotify,这个类继续继承BaseModelExtendIdAndName类,并实现INotifyPropertyChanged 接口,再实现通知方法

复制代码
/// <summary>
/// 带通知的 基类
/// </summary>
/// <typeparam name="idType"></typeparam>
public class BaseModelExtendIdAndNameNotify<idType> : BaseModelExtendIdAndName<idType>, INotifyPropertyChanged
{
    // 实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;

    // 触发属性更改通知的保护方法
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

// 子类RecipeModel
[MfTable("Recipe")]
public class RecipeModel : BaseModelExtendIdAndNameNotify<int>//BaseModelExtendIdAndName<int>
{
    private int _type; // 私有字段存储值

    /// <summary>
    /// 类型 RecipeTypeEnum
    /// </summary>
    public int Type 
    { 
        get => _type; 
        set 
        {
            if (_type != value) // 避免不必要的通知
            {
                _type = value;
                OnPropertyChanged(); // 触发通知(自动获取属性名)
            }
        } 
    }
}

2. 在 XAML 中绑定 UI 控件

将 UI 控件(如TextBoxComboBox等)的TextSelectedValue属性与RecipeModel.Type绑定,并设置Mode=TwoWay(双向绑定,默认对输入控件有效)。

示例 XAML(假设 DataContext 已设置为 RecipeModel 实例):
复制代码
<!-- 例如:使用TextBox绑定Type -->
<TextBox Text="{Binding Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

<!-- 或使用ComboBox绑定(若Type对应枚举值) -->
<ComboBox 
    ItemsSource="{Binding Source={StaticResource RecipeTypeEnumValues}}" 
    SelectedValue="{Binding Type, Mode=TwoWay}" 
    DisplayMemberPath="Description" 
    SelectedValuePath="Value"
/>
  • 说明
    • UpdateSourceTrigger=PropertyChanged:输入时立即更新数据源(TextBox 默认是失去焦点时更新)。
    • Type对应枚举(RecipeTypeEnum),建议在 ComboBox 中绑定枚举值(可通过 ObjectDataProvider 或代码生成枚举列表)。

3. 设置 DataContext

确保 UI 控件所在的容器(如 Window、UserControl)的DataContextRecipeModel的实例,绑定才能生效。

示例(在 Window 的构造函数中):
复制代码
public MainWindow()
{
    InitializeComponent();
    // 设置数据上下文为RecipeModel实例
    DataContext = new RecipeModel(); 
}

实现原理

  • Type属性的值通过代码修改时,set访问器中调用OnPropertyChanged(),触发PropertyChanged事件。
  • WPF 绑定引擎监听该事件,自动更新 UI 控件的显示值。
  • 当 UI 控件的值被用户修改时(如输入文本),双向绑定会自动更新Type属性的 值(触发set访问器)。

通过以上步骤,即可实现Type属性与 UI 的双向绑定及自动更新。核心是实现INotifyPropertyChanged接口并在属性变化时触发通知

相关推荐
玖笙&1 小时前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
雪豹阿伟1 小时前
9.C# —— string拓展方法、StringBuilder高性能处理
c#·上位机
李星星_Alex2 小时前
如何通过 C# 抓取抖音 RTMP 推流码实现自主推流
c#·抖音
qq7422349845 小时前
全面深入的C#核心知识体系与编程实践精要——从语法基础到高级特性系统学习指南
java·算法·c#
500846 小时前
GE 怎么做算子融合
分布式·架构·开源·wpf
fai厅的秃头姐!7 小时前
2586. 统计范围内的元音字符串数
开发语言·c#
正运动技术7 小时前
C#运动控制开源(二): CAD导图和小线段速度前瞻优化
c#·正运动技术·运动控制器·运动控制卡·正运动控制器·运动控制开源·ethercat运动控制器
楼田莉子7 小时前
C#学习:分支与循环
服务器·后端·学习·c#
还是叫明8 小时前
C#使用YOLO26进行图像识别(目标检测)
opencv·yolo·目标检测·c#
魔法阵维护师9 小时前
从零开发游戏需要学习的c#模块,第二十三章(粒子效果 —— 让游戏“活”起来本课目标)
学习·游戏·c#