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

标签 c# wpf data-binding itemscontrol

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

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

这有最佳实践吗?

最佳答案

您应该存储对象持久状态的只读副本,并允许用户修改参与绑定(bind)并在 UI 中编辑的对象的 UI 中可编辑的任何属性。您可以使用对象的存储的只读持久状态副本来将 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/

相关文章:

c# - 用于 HID (USB) 的 .NET API?

c# - 如何用更少的代码检查 mysql 数据库中的条目

wpf - DataGridCell Validation.ErrorTemplate 被忽略

c# - WPF ListBox 绑定(bind)首先起作用,但之后不起作用

c# - 如何自动验证我的 View 中的所有控件是否都设置了绑定(bind)?

wpf - CompositeCollection : why can't I bind against the data context of another control but have to use a CollectionViewSource? 的来源

c# - 如何避免重新初始化一个永不更改的类?

c# - 内部类需要访问外部类。好吗?

c# - 在 View 模型中创建控件实例

wpf - WPF中的连续文本代码