我有一个主细节实现如下的数据网格:
<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/