我需要一些帮助。我有一个Silverlight应用程序,父窗体有一个搜索按钮,点击时加载一个ModalDialog,它有3个文本框,两个按钮(用于搜索和重置)和一个DataGrid(telerik gridview,但我可以将它更改为任何网格,所以不是问题)。我在其中一个按钮上输入搜索条件,比如姓氏,并在网格上加载具有该特定姓氏的所有记录。我需要能够在网格上选择一行并且已经这样做了,所选行的详细信息应该在父窗口的控件上更新(父窗口上没有网格,就像数据输入表单一样)。我正在使用MVVM。如何在保持MVVM模式的同时实现这一目标?我刚刚看到很多关于在子节点到父节点/调用窗口的父节点之间传递数据的东西。
任何帮助和一些简单的代码示例都将受到高度赞赏。已经整整三天了,还没有把它搞清楚。
弗朗西斯。
答案 0 :(得分:1)
我在使用消息传递的Mvvm light工具包中完成了这项工作。它使用名为“PubSub”的东西,意思是“发布消息,订阅消息”
我在我的模态窗口的GridView中使用了一个命令。这是XAML:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command={Binding ItemSelectedCommand} />
</i:EventTrigger>
</i:Interaction.Triggers>
根据您使用的MVVM工具包的风格(如果有),语法可能会有所不同。在我的情况下,正如我所说,MVVM光。最终我使用iCommand接口将此命令传递给我的视图模型。在我的例子中,cmd引用指向Galasoft.MvvmLight.Command:
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;Assembly=GalaSoft.MvvmLight.Extras.SL4"
在我的子窗口的ViewModel中,我注册了命令,当它被触发时,我称之为:
Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder);
此行发布(发送)WorkOrders类型的消息(在我的应用程序中是一个模型类),通过SelectedWorkOrder。这行代码位于Command的内部,该命令在gridview的SelectionChanged事件中触发。示例代码为:
_ItemSelectedCommand = new RelayCommand(WorkOrderSelected);
private void WorkOrderSelected()
{
Messenger.Default.Send<TSMVVM.Model.WorkOrders>(SelectedWorkOrder);
}
在我的父窗口中,在构造函数中,我有:
Messenger.Default.Register<TSMVVM.Model.WorkOrders>(this, SetWorkOrder);
此行为WorkOrders类型的消息注册(或订阅)。每当通过我的应用程序发送消息时,类型为WorkOrder,它会调用一个函数:SetWorkOrder,如下所示:
private void SetWorkOrder(TSMVVM.Model.WorkOrders wo)
{
this.SelectedWO = wo;
}
我的DataForm有一个绑定到WorkOrders的ItemsSource,以及一个绑定到SelectedWO的CurrentItem,使用TwoWay绑定设置。因此,当我更新SelectedWO(通过Mvvm light toolkit的viewmodelbase实现INotifyPropertyChanged)时,DataForm会相应地更新。
如果您需要更多信息,请与我们联系!
斯科特