使用MVVM将数据传递到Silverlight 4中的子窗口

时间:2010-05-21 04:40:26

标签: silverlight datagrid mvvm silverlight-4.0 childwindow

我有一个带有主细节实现的数据网格,如下所示:

<data:DataGrid x:Name="dgData"  Width="600" ItemsSource="{Binding Path=ItemCollection}"
                       HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsVisibilityChanged">
                    <data:DataGrid.Columns>
                        <data:DataGridTextColumn Header="Item" Width="*" Binding="{Binding Item,Mode=TwoWay}"/>
                        <data:DataGridTextColumn Header="Company" Width="*" Binding="{Binding Company,Mode=TwoWay}"/>

                    </data:DataGrid.Columns>
                    <data:DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <data:DataGrid x:Name="dgrdRowDetail" Width="400" AutoGenerateColumns="False" HorizontalAlignment="Center" 
                                       HorizontalScrollBarVisibility="Hidden" Grid.Row="1">
                                <data:DataGrid.Columns>
                                    <data:DataGridTextColumn Header="Date" Width="*" Binding="{Binding Date,Mode=TwoWay}"/>
                                    <data:DataGridTextColumn Header="Price" Width="*" Binding="{Binding Price, Mode=TwoWay}"/>
                                    <data:DataGridTemplateColumn>
                                        <data:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <Button Content="Show More Details" Click="buttonShowDetail_Click"></Button>
                                            </DataTemplate>
                                        </data:DataGridTemplateColumn.CellTemplate>
                                    </data:DataGridTemplateColumn>
                                </data:DataGrid.Columns>
                            </data:DataGrid>
                        </DataTemplate>
                    </data:DataGrid.RowDetailsTemplate>
                </data:DataGrid>

我想在单击按钮时打开子窗口,该按钮显示有关产品的更多详细信息。

我正在使用MVVM模式。我的模型包含一个方法,该方法将Item名称作为输入并重新获取Details数据。

我的问题是如何将Item传递给ViewModel,ViewModel将从Model获取Details数据?和shoukd我打开新的儿童窗口?在View或ViewModel?

请帮忙。谢谢。

2 个答案:

答案 0 :(得分:5)

从视图模型中打开子窗口违反了视图和视图模型之间的分离,该模式应该是模式。因此,您可能没有太多选择打开子窗口的位置 - 网格所在页面的代码。 (这也违反了模式,但是,如果没有复杂的解决方案,那就是你所能做的一切。)我使用的是MVVM模式,但我并不是“宗教”。在效率要求时,我会违反该模式的一些规则。

就将项目传递给ViewModel而言 - 我想您可以在ViewModel上创建一个表示该项目ID的属性。我一直在使用子窗口作为更新和添加的数据输入表单。我倾向于为每一个创建一个ViewModel。在您的情况下,您将拥有一个表示项目详细信息的ViewModel。会有一些与项目和细节相关的ID。那将是ViewModel上的公共属性。您可以为子窗口创建一个构造函数,该构造函数将该ID作为参数。然后,子窗口构造函数可以创建ViewModel并向其发送ID。

像这样的东西 - 其中DomainEdit是子窗口的名称。

    public DomainEdit()
    {
        InitializeComponent();

        devm = new DomainEditVM();
        DataContext = devm;
    }

    public DomainEdit(Guid domainId) : this()
    {
        devm.DomainId = domainId;
        devm.GetDomain();
        txtTitle.Text = "Edit Domain";
    }

然后,从发生网格按钮单击的代码后面,使用新构造函数创建子窗口,传递从网格行中的项绑定获得的id,以及子项的独立视图模型窗口接管。

至少,这对我有用。

答案 1 :(得分:0)

中介模式(关于我们的复合应用程序的视图之间的消息传递服务)完成了这项工作。此外,在子窗口服务中委派详细信息视图的创建,并通过消息传递服务传递所选对象。然后你不会受到任何模式违规。