Catel数据窗口中的取消按钮

3

我可以帮您翻译成中文。以下是需要翻译的内容:

当我修改“ProductName”并按下“取消”按钮时,属性将重置为传递的参数。但如果我修改ProgramIds(添加或删除)并按下“取消”按钮,则集合不会设置为传递的值。为什么?

在我的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.Fody,那么为什么还要编写完整的属性呢?您可以轻松地将它们编写为public ProgramDataModel DataModel {get; set;} - Geert van Horrik
2个回答

0

我曾经遇到了与ObservableCollection相关的同样问题,只需在模型类上添加[Serializable]属性即可解决。

[Serializable]
public class ProgramDataModel:ValidatableModelBase
{
}

0

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

请在官方问题跟踪器上报告此问题(并提供可重现的步骤)。

作为一个临时解决方法,您可以覆盖CancelAsync方法,并在其中自行还原集合。或者作为替代方案,您可以在VM中使用克隆的集合,并仅在SaveAsync中替换项目。


谢谢,目前我使用重写的CancelAsync。 - streamdown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接