Arc*_*hie 3 silverlight datagrid mvvm childwindow silverlight-4.0
我有一个带有主细节实现的数据网格,如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
我想在单击按钮时打开子窗口,该按钮显示有关产品的更多详细信息.
我正在使用MVVM模式.我的模型包含一个方法,该方法将Item名称作为输入并重新获取Details数据.
我的问题是我应该如何将Item传递给ViewModel,它将从Model中获取Details数据?和shoukd我打开新的儿童窗口?在View或ViewModel中?
请帮忙.谢谢.
小智 5
从视图模型打开子窗口违反了视图和视图模型之间的分离,该模式应该是模式的全部.因此,您可能没有太多选择打开子窗口的位置 - 网格所在页面的代码.(这也违反了模式,但是,如果没有复杂的解决方案,那就是你所能做的一切.)我使用的是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";
}
Run Code Online (Sandbox Code Playgroud)
然后,从发生网格按钮单击的代码后面,使用新构造函数创建子窗口,传递从网格行中的项绑定获得的id,并且子窗口的独立视图模型接管.
至少,这对我来说是有用的.
归档时间: |
|
查看次数: |
8794 次 |
最近记录: |