【问题标题】:Pass data to Child Window in Silverlight 4 using MVVM使用 MVVM 将数据传递到 Silverlight 4 中的子窗口
【发布时间】:2011-02-22 04:53:49
【问题描述】:

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

<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,ViewModel 将从 Model 获取详细信息数据?我应该在哪里打开新的子窗口?在 View 或 ViewModel 中?

【问题讨论】:

    标签: silverlight datagrid mvvm silverlight-4.0 childwindow


    【解决方案1】:

    从视图模型打开子窗口违反了模式应该是关于视图和视图模型之间的分离。因此,对于从何处打开子窗口,您可能没有太多选择 - 网格所在页面的代码。 (这也违反了模式,但是,没有一个复杂的解决方案,这就是你能做的所有事情。)我使用 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,以及子窗口的独立视图模型窗口接管。

    至少,这对我有用。

    【讨论】:

    • 您真的需要使用 Guid 作为实体的 Id 吗?当您拥有大量实体时,请小心使用 Guid,它会占用数据库中的大量空间。对于 99% 的情况,int 或 long 就可以了。
    • 上面的示例是从我在客户站点工作的代码中提取的缩写的 sn-p。我没有选择将 Guids 用于 ids 的选择。这是我到达那里时数据库设计的一部分。我同意 int 或 long 会更好,但由于系统的限制,我们不得不使用 Guid。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 2010-10-20
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多