数据窗口中的 Catel 取消按钮

Catel Cancel button in DataWindow

然后我修改 "ProductName" 并按下 "Cancel" 按钮 属性 重置为传递的参数。但是,如果我修改 ProgramIds(添加或删除)并按 "Cancel" 按钮集合未设置为通过。为什么?

我在 ViewModel 中有:

[Model]
[Catel.Fody.Expose("ProductName")]
[Catel.Fody.Expose("ProgramIds")]
Public ProgramDataModel DataModel
  {
     get { return GetValue<ProgramDataModel>(DataModelProperty); }
     set { SetValue(DataModelProperty, value); }
  }

模型中:

public string ProductName
       {
           get { return GetValue<string>(ProductNameProperty); }
           set { SetValue(ProductNameProperty, value); }
       }
    public static readonly PropertyData ProductNameProperty = RegisterProperty(nameof(ProductName), typeof(string));

    public ObservableCollection<ProgramIDModel> ProgramIds
           {
               get { return GetValue<ObservableCollection<ProgramIDModel>>(ProgramIdsProperty); }
               set { SetValue(ProgramIdsProperty, value); }
           }
    public static readonly PropertyData ProgramIdsProperty = RegisterProperty(nameof(ProgramIds), typeof(ObservableCollection<ProgramIDModel>));

在 MainViewModel 中:

var viewModel = new ProductWindowViewModel(DataViewModel);
await _uiVisualizerService.ShowDialogAsync(viewModel);

Catel 使用 IEditableObject 来恢复用户点击取消时的状态。因为您使用的是 ID 集合,Catel 在重置集合时可能会遇到一些问题。

请在 official issue tracker.

报告此问题(带重现)

作为目前的解决方法,您可以重写 CancelAsync 方法并自行恢复集合。 作为替代方案,您可以在 VM 中使用克隆的集合,并且仅替换 SaveAsync.

中的项目

遇到与 ObservableCollection 完全相同的问题,只需将 [Serializable] 属性添加到模型 class

即可解决
[Serializable]
public class ProgramDataModel:ValidatableModelBase
{
}