【问题标题】:How to bind to WPF DataGridColumn in MVVM from ContextMenu?如何从 ContextMenu 绑定到 MVVM 中的 WPF DataGridColumn?
【发布时间】: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


    【解决方案1】:

    所以我终于找到了解决我的问题here 的方法。 但是我仍然不明白为什么我尝试使用时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。

    视图模型:

        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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2010-10-27
      • 2020-03-10
      • 2014-11-30
      • 2015-12-30
      相关资源
      最近更新 更多