我有一个包含不同列的DataGrid (TextBox、Combobox、DataPicker等)。通过MVVM显示数据。现在,我希望通过所选列对每个ContextMenu进行ColumnHeader到Group,但无法访问该列的绑定源(绑定路径)来告诉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>ViewModel:
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;
}
}发布于 2014-04-30 08:03:06
因此,我终于找到了解决问题的方法,这里。但是,我仍然不明白为什么CommandParameters在尝试使用:
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridColumnHeader}}, Path=Column.SortMemberPath}"下面是适用于我的代码:
<DataGrid.Resources>
<ContextMenu x:Key="DataGridColumnHeaderMenu">
<MenuItem Name="mi_group" Header="Make Groups"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, Path=DataContext.GroupColumn}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.Column.SortMemberPath}">
<MenuItem.Icon>
<Image Source="images/Treeview.png" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderMenu}" />
</Style></DataGrid.Resources>在我的例子中使用SortMemberPath的优点是我也可以为DataGridComboxColumn检索一个值(SelectedValuePath)。假设SelectedValuePath等于SortMemberPath,在我的例子中是这样的。
ViewModel:
private RelayCommand groupColumn;
public ICommand GroupColumn
{
get
{
if (groupColumn == null)
groupColumn = new RelayCommand(
(param) =>
{
UngroupColumns.Execute(null);
// param contains SortMemberPath of the DataGridColumn
string groupPropertyName = param as string;
if (groupPropertyName != null)
{
MyData.GroupDescriptions.Add(new PropertyGroupDescription(groupPropertyName));
MyData.SortDescriptions.Add(new SortDescription(groupPropertyName, ListSortDirection.Ascending));
}
});
return groupColumn;
}
}https://stackoverflow.com/questions/23293516
复制相似问题