You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 17:06:01