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

标签 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 传递给 ViewModel 以便从 Model 获取 Details 数据?我应该在哪里打开新的子窗口?在 View 或 ViewModel 中?

最佳答案

从 View 模型打开子窗口违反了 View 和 View 模型之间的分离,而模式应该是这样的。因此,对于从何处打开子窗口,您可能没有太多选择 - 网格所在页面的隐藏代码。 (这也违反了该模式,但是,没有复杂的解决方案,这就是您所能做的。)我使用 MVVM 模式,但我对此并不“虔诚”。当效率要求时,我会违反模式的一些规则。

至于将项目传递给 ViewModel - 我想您可以在 ViewModel 上创建一个属性来表示项目的 id。我一直在使用子窗口作为更新和添加的数据输入表单。我倾向于为它们中的每一个创建一个 ViewModel。在您的情况下,您将拥有一个表示项目详细信息的 ViewModel。会有某种与项目和详细信息相关的 ID。那将是 ViewModel 的公共(public)属性。您可以为将该 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";
    }

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

至少,这对我有用。

关于silverlight - 使用 MVVM 将数据传递到 Silverlight 4 中的子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879612/

相关文章:

c# - Silverlight 3/Prism - 将枚举值作为命令参数传递

c# - 需要找到解决 C# 和 silverlight 的方法

Silverlight 应用程序导致 Internet Explorer 关闭

c# - 如何在WPF中基于索引动态生成Togglebutton并对其执行操作

silverlight - 如何设置 Silverlight OOB 应用程序窗口的大小?

c# - WPF:无法在 DataGrids 中滚动

WPF ListView 性能非常慢 - 为什么? (ElementHost,还是其他原因?)

C# WPF DataGrid.ItemsSource 生成新列

c# - 如何在 MVVM 模式中更新模型和 View 模型?

silverlight - 使用 MVVM 返回时如何刷新 ViewModel