使用MVVM将数据传递到Silverlight 4中的子窗口
我有一个datagrid,其主细节实现如下:使用MVVM将数据传递到Silverlight 4中的子窗口,silverlight,datagrid,mvvm,silverlight-4.0,childwindow,Silverlight,Datagrid,Mvvm,Silverlight 4.0,Childwindow,我有一个datagrid,其主细节实现如下: <data:DataGrid x:Name="dgData" Width="600" ItemsSource="{Binding Path=ItemCollection}" HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsV
<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,后者将从模型中获取详细信息数据?我应该在哪里打开新的子窗口?在视图或视图模型中?从视图模型打开子窗口违反了该模式所要实现的视图和视图模型之间的分离。因此,对于从何处打开子窗口,您可能没有太多选择—网格所在页面的代码隐藏。(这也违反了这个模式,但是,缺少一个复杂的解决方案,这就是你所能做的一切。)我使用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都可以。上面的示例是一段缩写的代码片段,取自我在客户机站点上的工作。对于ID使用GUID,我没有选择权。当我到达那里时,这是数据库设计的一部分。我同意int或long会更好,但由于系统的限制,我们不得不使用guid。