Catel框架中对话框点击取消后已修改数据未重置问题咨询
问题根因
- 你的
Foo模型没有使用Catel规定的依赖属性写法定义属性,Catel的ModelBase依赖自身的属性系统实现编辑快照、变更追踪功能,普通CLR属性不会被纳入快照范围,自然无法回滚。 FooWindowViewModel构造函数内手动给[Model]标记的属性赋值的操作,没有触发Catel的编辑会话初始化逻辑。
修正方案
1. 修正Foo模型的属性定义
using Catel.Data; namespace My1stCatelProject.Models { public class Foo : ModelBase { public string TextProp { get => GetValue<string>(TextPropProperty); set => SetValue(TextPropProperty, value); } public static readonly PropertyData TextPropProperty = RegisterProperty(nameof(TextProp), typeof(string)); } }
2. 修正FooWindowViewModel的构造逻辑
移除构造函数内手动给Model赋值的代码,Catel会自动完成构造函数参数到[Model]属性的映射,同时自动开启编辑会话:
public class FooWindowViewModel : ViewModelBase { public FooWindowViewModel(Foo model) { // 无需手动赋值Model } public override string Title { get => "FooWindow"; protected set => base.Title = value; } [Model] public Foo Model { get; set; } [ViewModelToModel(nameof(Model))] public string TextProp { get; set; } }
3. 移除MainWindowViewModel中手动调用CancelEdit的代码
Catel的IUIVisualizerService在对话框返回取消结果时,会自动触发视图模型的CancelEdit逻辑,进而回滚关联模型到编辑前的状态,不需要手动调用。
完成以上修改后,取消对话框时的属性回滚功能即可正常生效。
内容的提问来源于stack exchange,提问作者ss11
相关产品推荐
相关产品推荐

