gpt4 book ai didi

c# - WPF - 如何在 UpdateSourceTrigger=Explicit 时向数据绑定(bind) ItemsControl 添加/删除项目

转载 作者:行者123 更新时间:2023-11-30 22:05:01 25 4
gpt4 key购买 nike

我有一个窗口,它基本上是一个显示联系人所有数据的对话框。用户可以编辑数据并按“SAVE”保存更改。 UpdateSourceTrigger 对于所有数据绑定(bind)都是显式的,以便用户能够取消他们的所有修改。

现在,联系人有一些地址,我将这些地址绑定(bind)到列表框的 ItemsSource。现在我必须能够添加/删除地址,但我想不修改基础集合来执行此操作,因为我不希望在用户“保存”之前对我的联系人对象进行任何修改"按钮点击。

有这方面的最佳实践吗?

最佳答案

您应该存储对象持久状态的只读副本,并允许用户在 UI 中修改任何参与绑定(bind)和可编辑的属性。您可以使用存储的对象的只读持久状态副本将 UI 中修改的对象与持久值进行比较,必要时恢复原始值并确定对象是否已修改且“可持久”...

这是我的做法:

public class SomeBusinessObject : INotifyPropertyChanged
{
private int id;
public int Id
{
get { return id; }
set { id = value; OnPropertyChanged("Id"); }
}
private int property1;
public int Property1
{
get { return property1; }
set { property1 = value; OnPropertyChanged("Property1"); }
}
private string property2;
public string Property2
{
get { return property2; }
set { property2 = value; OnPropertyChanged("Property2"); }
}
//... Other properties

public bool IsModified { get; set; }
public bool IsPersistable { get; set; }
public SomeBusinessObject PersistedState { get; private set; }

public SomeBusinessObject(int id, int p1, string p2, savePersistedState = false)
{
Id = id;
Property1 = p1;
Property2 = p2;
//Set other properties
if (savePersistedState) PersistedState = new SomeBusinessObject(id, p1, p2)
}
}

如您所见,默认情况下对象不会保存其持久状态,这允许您仅在需要时(例如,在 UI 中进行编辑时)将对象的持久状态副本作为对象的另一个属性。

这种方法结合实现 INotifyPropertyChanged 接口(interface)允许您订阅对象的 PropertyChanged 事件并设置 IsModifiedIsPersistable 标志基于 BI 规则并很容易地从只读状态恢复对象的持久状态(注意 private set; 属性 setter )PersistedState 副本创建时对象是首先实例化。

它还允许您非常轻松地实现 WPF 命令的 CanExecuteChanged 事件。例如,表单上保存按钮的 SaveCommand 可以只检查对象的 IsPersistable 标志以确定对象是否“持久化”以及按钮是否应该启用(显然你会根据某些业务逻辑处理 PropertyChanged 事件时更改标志并将其与持久状态对象进行比较...

关于c# - WPF - 如何在 UpdateSourceTrigger=Explicit 时向数据绑定(bind) ItemsControl 添加/删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com