我在應用程式中有一個設定視窗,它有一個按鈕,基本上是“保存并關閉”操作。
現在,視圖模型知道如何保存資料,命令就在那里,并通過{Binding ...}Xaml鏈接。
為了關閉視窗,我將元素本身作為命令引數傳遞。我在實踐中并不關心它,但我想知道解決這個問題的“不錯的 MVVM 方式”是什么。在這種情況下,保持 UI 行為分離的理想/教科書方式是什么?
uj5u.com熱心網友回復:
關閉視窗是視圖的責任,因此應該由視圖中的某些內容來完成。通過視圖模型保存資料是模型的責任。您需要的是視圖中可以關閉該視窗的內容。還有一些方法可以告訴它從視圖模型中關閉。視圖模型告訴視圖某些更改的明顯方法是系結。
我處理這個的方法是從視圖模型系結一個命令。該命令進行保存,然后設定系結的 bool 屬性。視圖系結到此屬性并關閉自身。這樣 viewmodel 不需要任何對視窗的參考。它所做的只是設定它的一個屬性。
這里有一些代碼可以給你一個味道。
我想只要你看到它,你就會有這個想法。有一個從沒有 ui 的控制元件繼承的類。CloseMe 看起來像:
public class CloseMe : Control
{
public bool? Yes
{
get
{
return (bool?)GetValue(YesProperty);
}
set
{
SetValue(YesProperty, value);
}
}
public static readonly DependencyProperty YesProperty =
DependencyProperty.Register("Yes",
typeof(bool?),
typeof(CloseMe),
new PropertyMetadata(null, new PropertyChangedCallback(YesChanged)));
private static void YesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((bool?)e.NewValue != true)
{
return;
}
var me = (CloseMe)d;
Window parent = Window.GetWindow(me) as Window;
parent.Close();
}
}
在我的視窗中:
<local:CloseMe Yes="{Binding CloseWindow, Mode=TwoWay}"/>
CloseWindow 是我在該視圖模型中提到的 bool 屬性。將其設定為 true,CloseMe 控制元件 YesProperty 將更改為 true。回呼觸發并查找其父視窗的可視化樹。然后它關閉那個視窗并......完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330496.html
