WPF列标题单击带有命令参数MVVM的命令绑定

WPF列标题单击带有命令参数MVVM的命令绑定,wpf,xaml,sorting,datagrid,command,Wpf,Xaml,Sorting,Datagrid,Command,我正在尝试自己处理WPF DataGrid中的排序功能。 我需要能够在单击列标题时绑定命令,并将绑定的属性名称作为命令参数发送到命令 以下是我目前的情况: XAML: <DataGrid Grid.Row="2" Margin="{StaticResource ControlStartPosition}" RowStyle="{StaticResource SelectedRowNoBackgroundColor}" CellStyle="{S

我正在尝试自己处理WPF DataGrid中的排序功能。 我需要能够在单击列标题时绑定命令,并将绑定的属性名称作为命令参数发送到命令

以下是我目前的情况:

XAML:

       <DataGrid Grid.Row="2" Margin="{StaticResource ControlStartPosition}"
        RowStyle="{StaticResource SelectedRowNoBackgroundColor}"
        CellStyle="{StaticResource SelectedCellNoBackgroundColor}"
        Style="{StaticResource AlternatingRowBackgroundGridStyle}"
        x:Name="MechanicsGrid"  
        ItemsSource="{Binding Mechanics}"
        IsReadOnly="True"
        GridLinesVisibility="All"
        SelectionUnit="FullRow"
        AutoGenerateColumns="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource MetroDataGridColumnHeader}">
                <Setter Property="Controls:ControlsHelper.ContentCharacterCasing" Value="Normal"/>
                <Setter Property="Command"  Value="{Binding DataContext.GridSortCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                <Setter Property="CommandParameter" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/>
            </Style>

        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
                <DataGridTextColumn  Width="*"  Header="{x:Static p:MechanicsView.GridMechanicNameColumn}" Binding="{Binding Name}" />

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding Path=DataContext.DeleteMechanicCommand,RelativeSource= {RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}" 
                                CommandParameter="{Binding Path=Id}" Width="27" Height="27" Margin="10 -5 10 -5" Style="{DynamicResource MetroCircleButtonStyle}">
                                <Rectangle Width="11" Height="11" Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}">
                                    <Rectangle.OpacityMask>
                                        <VisualBrush Stretch="Fill" Visual="{DynamicResource appbar_close}" />
                                    </Rectangle.OpacityMask>
                                </Rectangle>
                            </Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    private ObservableCollection<MechanicModel> mechanics;
    public ObservableCollection<MechanicModel> Mechanics
    {
        get
        {
            return mechanics;
        }
        set
        {
            Set(() => Mechanics, ref mechanics, value);
        }
    }
命令:

       <DataGrid Grid.Row="2" Margin="{StaticResource ControlStartPosition}"
        RowStyle="{StaticResource SelectedRowNoBackgroundColor}"
        CellStyle="{StaticResource SelectedCellNoBackgroundColor}"
        Style="{StaticResource AlternatingRowBackgroundGridStyle}"
        x:Name="MechanicsGrid"  
        ItemsSource="{Binding Mechanics}"
        IsReadOnly="True"
        GridLinesVisibility="All"
        SelectionUnit="FullRow"
        AutoGenerateColumns="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource MetroDataGridColumnHeader}">
                <Setter Property="Controls:ControlsHelper.ContentCharacterCasing" Value="Normal"/>
                <Setter Property="Command"  Value="{Binding DataContext.GridSortCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                <Setter Property="CommandParameter" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/>
            </Style>

        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
                <DataGridTextColumn  Width="*"  Header="{x:Static p:MechanicsView.GridMechanicNameColumn}" Binding="{Binding Name}" />

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding Path=DataContext.DeleteMechanicCommand,RelativeSource= {RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}" 
                                CommandParameter="{Binding Path=Id}" Width="27" Height="27" Margin="10 -5 10 -5" Style="{DynamicResource MetroCircleButtonStyle}">
                                <Rectangle Width="11" Height="11" Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}">
                                    <Rectangle.OpacityMask>
                                        <VisualBrush Stretch="Fill" Visual="{DynamicResource appbar_close}" />
                                    </Rectangle.OpacityMask>
                                </Rectangle>
                            </Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    private ObservableCollection<MechanicModel> mechanics;
    public ObservableCollection<MechanicModel> Mechanics
    {
        get
        {
            return mechanics;
        }
        set
        {
            Set(() => Mechanics, ref mechanics, value);
        }
    }
绑定到列标题的命令是:

    private RelayCommand<object> gridSortCommand;
    public RelayCommand<object> GridSortCommand
    {
        get
        {
            return gridSortCommand
                ?? (gridSortCommand = new RelayCommand<object>(
                p =>
                {

                },
                p => true));
        }
    }
private RelayCommand gridsort命令;
公共中继公用电网命令
{
得到
{
返回gridsort命令
??(gridSortCommand=新的继电器命令(
p=>
{
},
p=>true);
}
}

因此,对于p=>我当前得到了列的标题,我想得到的是属性名,在本例中至少是“name”作为字符串,我可以在视图模型中构造排序逻辑。不幸的是,我不能将其绑定为命令参数。

如果要在命令中传递参数,只需使用
多重绑定

然后可按如下方式使用:

<MultiBinding>
    <Binding Path="Id"/>
    <Binding Path="Name"/>
    <Binding Path="DirectionOfSort"/>
</MultiBinding>  
在xaml中:

<converter:MultiValueConverter x:Key="multi"/>
其中,
Util
基本上是一个枚举,在xaml中引用,如下所示:

xmlns:converter="clr-namespace:View.Converters"
xmlns:util="clr-namespace:Utilities;assembly=Utilities"  

您的
视图模型中是否需要此项?这是一种可以在代码隐藏中完成的
视图
特定功能。这里有一个关于如何排序的例子。我明白你的意思,谢谢你的链接。我也有分页功能,我的数据加载存储库在视图模型中,我认为向视图提供数据是视图模型的责任。啊,我明白了,你在帖子中没有提到分页。这将使事情变得复杂一些,因为您必须在
VM
中执行此操作才能提供有效页面。至于
CommandParameter
使用
MultiBinding
,这将为您传递多个参数提供便利,然后该参数变为
object[]
。嗯。如果你需要更多关于多重绑定的帮助,我会给你一个答案。在我的情况下,如果你能给我一个多重绑定的例子,这将是非常有帮助的。理想情况下,我希望传递列绑定的属性名和排序顺序,但似乎我不能从XAML代码中管理它。你运气好吗?
xmlns:converter="clr-namespace:View.Converters"
xmlns:util="clr-namespace:Utilities;assembly=Utilities"