私はWPFデータバインディングに慣れてきました。私はほとんどの基本を理解しましたが、いくつかのことを理解するのに苦労しています.
まず、バンクのコレクションを持つ Synth というオブジェクトがあるとします。同様に、バンクにはパッチのコレクションがあります。DataContext を単一の Synth オブジェクトに設定するシンセ ウィンドウがあります。すべてのバンク ({Binding Banks}) を表示する 1 つのリストボックス (lstBanks) と、すべてのパッチ ({Binding ElementName=lstBanks, Path=SelectedItem.Patches}) を表示する別のリストボックス (lstPatches) があります。これはすべてうまくいきます。バンクを選択すると、該当するパッチが表示されます。
質問 1: 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();
}
ユーザーがパッチ ダイアログで [OK] をクリックすると、フォームのプロパティが DataContext に戻されます。これが最善の方法かどうかはわかりませんでした。ユーザーがメインのシンセウィンドウで [OK] をクリックするまで、変更を実際に保存したくありません。そのため、すべてのバンクとパッチの編集はローカルのままにし、ユーザーがダイアログで [キャンセル] ではなく [OK] をクリックした場合にのみ「ローカルに」コミットする必要があります。
質問 2: ダイアログを使用してパッチを更新したら、その変更を lstPatches に反映するにはどうすればよいですか?
タイプ DBSet に不可欠なモデルを直接ナビゲートすることは観察できないことを理解しています。Observable コレクションの使用に関する投稿を見たことがありますが、これは WPF データバインディングで簡単にできるはずのことを複雑にするだけではありませんか? それが唯一の方法である場合、コードファーストモデルを使用してこれを簡単に達成するにはどうすればよいですか?