【发布时间】:2014-04-25 12:42:22
【问题描述】:
我有一个具有不同列(TextBox、Combobox、DataPicker 等)的 DataGrid,通过 MVVM 显示数据。现在我想让每个 ColumnHeader 上的 ContextMenu 按选定的列进行分组,但是我无法访问 Column 的绑定源(绑定路径)来告诉 ViewModell 它必须对哪一列进行分组。当我第一次打开上下文菜单时它工作正常,但是当我再次打开上下文菜单时,它仍然从第一次通过 SortMemberPath。我做错了什么?
XAML:
<DataGrid.Resources>
<ContextMenu x:Key="DataGridColumnHeaderMenu">
<MenuItem Name="mi_group" Header="Grouping"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, Path=DataContext.GroupColumn}"
CommandParameter="{Binding Path=Column.SortMemberPath, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridColumnHeader}}">
</MenuItem></ContextMenu>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderMenu}" />
</Style>
</DataGrid.Resources>
视图模型:
public ICommand GroupColumn
{
get
{
if (groupColumn == null)
{
groupColumn = new RelayCommand( (param) => {
UngroupColumns.Execute(null);
string groupPropertyName = param as string; ///Don't want this Switch. ViewModel doesn't know name of the header
switch (groupPropertyName)
{
case "Project": {groupPropertyName = "project_id"; break;}
case "Date": {groupPropertyName = "date"; break;}
case "Person": {groupPropertyName = "person_id"; break;}
default: {groupPropertyName = null; break; }
}
if (groupPropertyName != null)
{
MyData.GroupDescriptions.Add(new PropertyGroupDescription(groupPropertyName));
MyData.SortDescriptions.Add(new SortDescription(groupPropertyName, ListSortDirection.Ascending));
}
});
}
return groupColumn;
}
}
【问题讨论】:
标签: wpf mvvm binding datagrid contextmenu