現在、MVVM (Light) を使用して WPF でアプリケーションを構築しています。ただし、場合によっては、ユーザーがボタンをクリックしたときに新しいダイアログ (WPF も) を開く必要があります。しかし、これは厳しい戦いです。
これが私がやっている方法です:
private void _ShowItemDialog(Item item)
{
var itemVM = new ItemViewModel();
itemVM.CurrentItem = item ?? new Item();
itemVM.Load();
var itemView = new View.ItemView() { DataContext = itemVM };
if (itemView.ShowDialog() == true)
{
if (item == null)
{
itemList.Add(itemVM.CurrentItem);
}
}
itemVM.Cleanup();
}
また、itemView XAML には DataContext へのバインドがありません。そうしないと、ViewModel の 2 つの異なるインスタンスが作成されます。
Window タグ内。ShowDialog で結果を取得するには、DialogCloser コードを使用します。
public static class DialogCloser
{
public static readonly DependencyProperty DialogResultProperty =
DependencyProperty.RegisterAttached(
"DialogResult",
typeof(bool?),
typeof(DialogCloser),
new PropertyMetadata(DialogResultChanged));
private static void DialogResultChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var window = d as Window;
if (window != null)
window.DialogResult = e.NewValue as bool?;
}
public static void SetDialogResult(Window target, bool? value)
{
target.SetValue(DialogResultProperty, value);
}
}
ItemView では、これは次のように Window タグ内で宣言されます。
my:DialogCloser.DialogResult="{Binding DialogResult}"
また、ダイアログが閉じられると、終了イベントによって DialogResult が true または false に設定されます。
これは、初めて画面を開いたときは完全に機能しますが、ダイアログを閉じた後に再度開くことはできません。
ダイアログを開くためのより良いアイデアがあるかどうか、およびこのコードが機能しない理由を知りたいです。
ありがとう!
編集: 私はすでにコードを修正しました。私がする必要があるのは、新しい ViewModel を作成し、ダイアログが開かれるたびにそれを DataContext にアタッチすることです。さらに、XAML から DataContext バインディングを削除する必要がありました。上記のコードの変更を確認してください。
これらの変更により、ViewModelLocator から ViewModel を使用できないことがわかりました。これは、新しいウィンドウごとに新しいインスタンスではなく「シングルトン」であるためです。したがって、DialogResult は最後の値を保持し、その値を null に戻そうとすると (ViewModel が初期化されたときのように) 例外がスローされます。なぜこれが起こるのか手がかりはありますか?システム全体で同じ戦略を維持できるため、ViewModelLocator から ViewModel を使用することは私にとって非常に良いことです。
ありがとうございました!