WPF列标题单击带有命令参数MVVM的命令绑定
我正在尝试自己处理WPF DataGrid中的排序功能。 我需要能够在单击列标题时绑定命令,并将绑定的属性名称作为命令参数发送到命令 以下是我目前的情况: XAML: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
<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"