繁体   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