[英]How can I pass value from child window to parent window by ComboBox (WPF and MVVM)
我有一個子窗口,還有一個ComboBox。 我想使用WPF和MVVM將子窗口的值發送到父窗口。 誰能幫我怎么做??
在這種情況下,不要專注於MVVM,MVVM並非旨在將值從子窗口傳遞回父窗口。
相反,如果您在視圖模型中有某些代碼,或者在生成或打開子窗口的視圖中有代碼,則該代碼應負責檢索由子窗口確定的值並將其傳播回適當的屬性(在任何綁定都將在界面上反映該值-這是應該使用MVVM的地方)。
最好的辦法是確保打開子窗口的代碼不會直接訪問子窗口上的ComboBox,而是子窗口應將其綁定到一個屬性,然后該屬性可以由父代碼訪問(最好通過接口)。
要進一步閱讀,請查看創建MVVM友好對話策略 。 這應該是您的首選解決方案,然后父代碼僅使用Dialog Service來顯示子窗口,而Dialog Service則負責匯總子窗口結果並將其返回給父窗口中的調用代碼。
由於您沒有提供足夠的信息,因此,假設子窗口是一個對話框。 現在,假設子窗口是Child()類,其ViewModel在Child類中具有對象,例如
public ChildViewModel chVM { get; set; }
並且此viewmodel具有以下屬性:
public string ComboBoxSelectedValue { get; set; }
讓對話框的xaml具有如下組合框:-
<ComboBox Name="cbTest" SelectedItem="{Binding ComboBoxSelectedValue}">
<ComboBoxItem>A</ComboBoxItem>
<ComboBoxItem>B</ComboBoxItem>
<ComboBoxItem>C</ComboBoxItem>
</ComboBox>
現在,每次在combobnox中選擇一個值時,其視圖模型中的屬性ComboBoxSelectedValue都將填充所選值。
您必須處理父頁面上對話框的Close事件。 讓我們繼續進入作為父頁面的類Parent():
public partial class Parent : Page
{
private Child ch;
public Parent()
{
InitializeComponent();
ch= new Child();
ch.Closed += ChildClosed;
}
public void ChildClosed(object sender, System.EventArgs e)
{
//even after closing of child window
var selectedValue = ch.chVM.ComboBoxSelectedValue;
}
public void OpenChild(object sender, System.EventArgs e)
{
//Button event to open the child window
ch.Show();
}
}
如果這是您需要的,請回答。 否則,請隨時尋求其他解決方案。 也可以在沒有mvvm的情況下完成此操作,但是由於您要求使用MVVM,因此這是解決方案。
我發現允許視圖模型相互通信的最佳解決方案是通過消息傳遞框架,我更喜歡nuget上的MVVM light。
您的子視圖模型通過框架(父級訂閱)發送一條消息。 與事件處理程序沒什么不同。
兒童...
Messenger.Default.Send<MyMessageClass>(message);
可以在組合框中選擇項目綁定設置器,也可以將其放入命令操作方法的一部分。
父母...
Messenger.Default.Register<MyMessageClass>(this, OnMessage);
MyMessageClass必須擴展BaseMessage,並應包含要共享的數據的屬性。 父級中的OnMessage方法應接受此類作為參數,並使用這些值在父級中執行您需要執行的任何操作。
MVVM更好,因為它可以使邏輯脫離代碼或視圖,但也不會產生強耦合。 如果視圖模型發送的消息沒有其他視圖模型收到,則什么也不會發生-您還使用消息對象而不是檢查視圖模型來共享數據。
msdn的教程在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.