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