簡體   English   中英

如何通過ComboBox將值從子窗口傳遞到父窗口(WPF和MVVM)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM