0

我刚刚熟悉 WPF 数据绑定。我已经弄清楚了大部分基础知识,但我在弄清楚一些事情时遇到了麻烦。

首先,假设我有一个名为 Synth 的对象,它有一个 Bank 集合。反过来,银行有一组补丁。我有一个合成器窗口,我将 DataContext 设置为单个合成器对象。我有一个列表框 (lstBanks) 显示所有银行 ({Binding Banks}) 和另一个 (lstPatches) 显示所有补丁 ({Binding ElementName=lstBanks, Path=SelectedItem.Patches})。这一切都很好。当我选择银行时,我会看到适用的补丁。

问题 1:如何将选定的 Patch 加载到具有双向绑定的对话框窗口中,但如果 DialogResult = false 则取消这些更改?

现在,我有一个补丁对话框,它在构造函数中接收一个补丁,它设置为它的 DataContext,但我只使用 OneWay 绑定。这发生在双击 lstPatches 时。

    private void Patch_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        Models.Patch patch = (Models.Patch)((ListBoxItem)sender).DataContext;

        PatchEdit p = new PatchEdit(patch);
        p.Owner = this;
        if (p.ShowDialog().GetValueOrDefault())
        {
            // Do stuff if applicable
        }
    }

这是我的 PatchEdit 构造函数和 OK 按钮事件:

    public PatchEdit(Models.Patch Patch) : this()
    {
        this.DataContext = Patch;
    }

    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        Models.Patch p = (Models.Patch)DataContext;
        p.Name = txtName.Text;
        p.MidiProgramChangeValue = int.Parse(txtPCN.Text);
        this.DialogResult = true;
        this.Close();
    }

如果用户在补丁对话框上单击“确定”,那是我将表单中的属性设置回 DataContext 的时候。我不确定这是否是最好的方法。在用户单击主合成器窗口上的确定之前,我不想真正保存更改。所以所有的音色库和补丁编辑应该只保留在本地,并且只有在用户单击“确定”而不是对话框上的“取消”时才“本地”提交。

问题 2:一旦通过对话框更新了补丁,我如何才能在 lstPatches 中反映该更改?

我知道直接导航我的模型是 DBSet 类型必不可少的,这是不可观察的。我看过有关使用 Observable 集合的帖子,但这不只是使 WPF 数据绑定应该很容易的事情变得复杂吗?如果这是唯一的方法,我如何使用我的代码优先模型轻松完成此任务?

4

1 回答 1

0

问题 1:绑定到第二个/临时对象。如果用户取消,请将其丢弃。如果他们不这样做,请使用它来更新您的原始对象。数据绑定并没有真正提供“撤消”或“重置”方法。

问题 2:不,使用 ObservableCollection 不会使事情复杂化。这是推荐的做事方式。没有它们,实际上工作要困难得多。

于 2012-06-24T21:28:53.320 回答