我刚刚熟悉 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 数据绑定应该很容易的事情变得复杂吗?如果这是唯一的方法,我如何使用我的代码优先模型轻松完成此任务?