我有一个子窗口,有一个ComboBox。我想使用WPF和MVVM将子窗口的值发送到父窗口。谁能帮我怎么做?
答案 0 :(得分:0)
在这种情况下不要专注于MVVM,MVVM不是设计用于将子窗口中的值传递回父窗口。
相反,如果您在视图模型中有一些代码或者生成或打开子窗口的视图后面的代码,那么该代码应该负责检索子窗口确定的值并将其传播回适当的窗口。 property(此时任何绑定都会反映UI中的值 - 这就是应该使用MVVM的地方)。
你可以做的最好的事情是确保打开子窗口的代码不直接访问子窗口上的ComboBox,而子窗口应该将它绑定到一个属性,然后由父代码访问(最好通过界面)。
如需进一步阅读,请查看Creating an MVVM friendly dialog strategy。这应该是您首选的解决方案,然后父代码只使用Dialog Service来显示子窗口,Dialog Service负责聚合子窗口结果并使其可用于父窗口中的调用代码。
答案 1 :(得分:0)
由于你没有提供足够的信息,我们假设子窗口是一个对话框。现在,让我们假设子窗口是一个Child()类,其ViewModel具有Child类中的对象,比如说
public ChildViewModel chVM { get; set; }
此视图模型具有以下属性:
public string ComboBoxSelectedValue { get; set; }
让对话框的xaml具有组合框: -
<ComboBox Name="cbTest" SelectedItem="{Binding ComboBoxSelectedValue}">
<ComboBoxItem>A</ComboBoxItem>
<ComboBoxItem>B</ComboBoxItem>
<ComboBoxItem>C</ComboBoxItem>
</ComboBox>
现在,每次在组合框中选择一个值时,其视图模型中的属性ComboBoxSelectedValue将使用所选值填充。
您必须在父页面上处理对话框的关闭事件。让我们转到父页面类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,所以这就是解决方案。
答案 2 :(得分:0)
我发现允许视图模型相互通信的最佳解决方案是通过消息传递框架,我的偏好是nuget上可用的MVVM光。
您的子视图模型通过父订阅的框架发送消息。与事件处理程序没有什么不同。
...儿童
Messenger.Default.Send<MyMessageClass>(message);
可以在组合框中选择项目绑定设置器,或命令操作方法的一部分。
父...
Messenger.Default.Register<MyMessageClass>(this, OnMessage);
MyMessageClass必须扩展BaseMessage,并且应包含要共享的数据的属性。父级中的OnMessage方法应该接受此类作为参数,并在父级中使用这些值执行任何操作。
是更好的MVVM,因为它保持逻辑不在代码中或查看,但也不会产生强大的耦合。如果视图模型发送的消息没有其他视图模型接收,则不会发生任何事情 - 您还使用消息对象而不是检查视图模型来共享数据。
msdn here上的教程。