代码之家  ›  专栏  ›  技术社区  ›  Archie

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

  •  3
  • Archie  · 技术社区  · 15 年前

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

    <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模式。我的模型包含一个方法,该方法以项名称作为输入,并返回细节数据。

    我的问题是如何将该项传递给将从模型获取详细数据的ViewModel?我应该在哪里打开新的儿童窗口?在视图或视图模型中?

    请帮忙。谢谢。

    2 回复  |  直到 11 年前
        1
  •  5
  •   Chazmanian    15 年前

    从视图模型打开子窗口违反了视图和视图模型之间的分离,而该模式应该是所有的。因此,对于从何处打开子窗口,您可能没有太多选择——网格所在页面的代码隐藏在后面。(这也违反了模式,但是,除了一个复杂的解决方案,这是你所能做的。)我使用MVVM模式,但我并不“宗教”它。当效率决定的时候,我会违反模式的一些规则。

    至于将该项传递给ViewModel,我想您可以在ViewModel上创建一个表示该项的ID的属性。我一直在使用子窗口作为数据输入窗体进行更新和添加。我倾向于为它们中的每一个创建一个视图模型。在您的案例中,您将拥有一个表示项目详细信息的ViewModel。会有一些与项目和细节相关的ID。这将是ViewModel上的公共属性。可以为将该ID作为参数的子窗口创建一个构造函数。然后,子窗口构造函数可以创建视图模型并将ID发送给它。

    类似这样-其中,域编辑是子窗口的名称。

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

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

    至少,这是我一直在努力的。

        2
  •  0
  •   Aggelos Biboudis    14 年前

    中介模式(关于复合应用程序的视图之间的消息传递服务)完成了这项工作。此外,委托在子窗口服务中创建细节视图,并通过消息传递服务传递所选对象。这样就不会有任何模式冲突。

    推荐文章