没有通知功能的属性改成有通知功能的属性
/// </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 控件(如TextBox、ComboBox等)的Text或SelectedValue属性与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)的DataContext为RecipeModel的实例,绑定才能生效。
示例(在 Window 的构造函数中):
public MainWindow()
{
InitializeComponent();
// 设置数据上下文为RecipeModel实例
DataContext = new RecipeModel();
}
实现原理
- 当
Type属性的值通过代码修改时,set访问器中调用OnPropertyChanged(),触发PropertyChanged事件。 - WPF 绑定引擎监听该事件,自动更新 UI 控件的显示值。
- 当 UI 控件的值被用户修改时(如输入文本),双向绑定会自动更新
Type属性的 值(触发set访问器)。
通过以上步骤,即可实现Type属性与 UI 的双向绑定及自动更新。核心是实现INotifyPropertyChanged接口并在属性变化时触发通知。