Silverlight 4 MVVM DataGrid和子窗口将数据传递回父窗口

时间:2011-04-30 00:25:25

标签: silverlight mvvm datagrid

我需要一些帮助。我有一个Silverlight应用程序,父窗体有一个搜索按钮,点击时加载一个ModalDialog,它有3个文本框,两个按钮(用于搜索和重置)和一个DataGrid(telerik gridview,但我可以将它更改为任何网格,所以不是问题)。我在其中一个按钮上输入搜索条件,比如姓氏,并在网格上加载具有该特定姓氏的所有记录。我需要能够在网格上选择一行并且已经这样做了,所选行的详细信息应该在父窗口的控件上更新(父窗口上没有网格,就像数据输入表单一样)。我正在使用MVVM。如何在保持MVVM模式的同时实现这一目标?我刚刚看到很多关于在子节点到父节点/调用窗口的父节点之间传递数据的东西。

任何帮助和一些简单的代码示例都将受到高度赞赏。已经整整三天了,还没有把它搞清楚。

弗朗西斯。

1 个答案:

答案 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会相应地更新。

如果您需要更多信息,请与我们联系!

斯科特