Wpf 绑定到DataGridColumnHeader.Command
我需要使用Wpf 绑定到DataGridColumnHeader.Command,wpf,xaml,mvvm,binding,datagrid,Wpf,Xaml,Mvvm,Binding,Datagrid,我需要使用DataGridColumnHeader上的命令对数据进行排序。标准的DataGrid排序功能对我来说是不够的,因为在DataGrid中没有显示所有数据。我的虚拟机中甚至没有所有的数据。(这是不可能的…太多了)我只是从服务器请求具体的数据页。现在我还想从排序的数据中得到具体的页面 所以我这样做了: 它工作得很好。现在我只想拥有AutoGenerateColumns=“True”,不幸的是,它不再有效。是否有人能解释为什么它不能用于自动生成的列,并为我提供一些解决方案?提前谢谢你 编
DataGridColumnHeader
上的命令对数据进行排序。标准的DataGrid
排序功能对我来说是不够的,因为在DataGrid
中没有显示所有数据。我的虚拟机中甚至没有所有的数据。(这是不可能的…太多了)我只是从服务器请求具体的数据页。现在我还想从排序的数据中得到具体的页面
所以我这样做了:
它工作得很好。现在我只想拥有AutoGenerateColumns=“True”
,不幸的是,它不再有效。是否有人能解释为什么它不能用于自动生成的列,并为我提供一些解决方案?提前谢谢你
编辑
这可能与以下事实有关:跟随也不起作用
<DataGrid ItemsSource="{Binding Path=Entities, Mode=OneWay}" CanUserSortColumns="False" SelectionMode="Single" SelectedItem="{Binding Path=SelectedEntity}">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Command" Value="{Binding Path=MyCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTemplateColumn>
<!-- HERE IS THE CHANGE -->
<DataGridTemplateColumn.Header>Column1</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Property1}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
但我还是不太明白为什么。因此,回答详细的解释将获得赏金 的容器项与中的每个项目的容器项相同
由于ListBoxItem的DataContext将设置为ListBox的ItemsSource中的一个项,因此DataGridColumnHeader的DataContext将设置为DataGridColumn.Header对象是很自然的。正如您的发现所示,自动生成的列将具有DataGridColumn.Header,其DataContext设置为string Header对象
如果您不使用自动生成的列,而是指定DataGridTemplateColumn和DataGridTemplateColumn.Header,那么DataContext的标准继承仍然适用,这就是为什么它第一次适用于您
编辑:在描述此行为的地方,快速搜索不会立即提供结果。然而,核实事实并不难:
Xaml:
视图模型:
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
if(this.PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
私有可观测集合MyClass;
公共ObservableCollection MyClasses{get{return}MyClasses;}set{MyClasses=value;OnPropertyChanged(“MyClasses”);}
公共视图模型()
{
MyClasses=新的ObservableCollection()
{
new Class1(){Name=“Andy”},
new Class1(){Name=“Mark”},
new Class1(){Name=“Peter”},
new Class1(){Name=“Gregor”},
new Class1(){Name=“Jenny”}
};
}
}
代码隐藏(仅用于说明):
private void DataGrid\u MouseRightButtonUp\u 1(对象发送器,MouseButtonEventArgs e)
{
if(例如,OriginalSource是Microsoft.Windows.Themes.DataGridHeaderOrder)
{
对象dataContext=((Microsoft.Windows.Themes.DataGridHeaderOrder)e.OriginalSource);
}
}
右键单击手动列标题(文本块外部)生成以下dataContext:
右键单击自动生成的列标题:
是的,我就是这么想的。但这并不能解释为什么它第一次起作用。这也是一个很好的答案,所以+1,但阿达拜伦在他的答案中投入了更多的精力。非常感谢。我懂了。。。您确定您的第一条语句(字符串真的是datacontext吗)?你能给我指一些我可以验证这一点的资源吗?第二次我还定义了DatagridTemplateColumn,但我想我理解了。我添加了一些说明。在您的第一次编辑中,您将完整标题设置为string类型的对象,而不是DataGridColumnHeader对象,后者反过来又具有可以继承父DataContext的DataContext,我想这就是此操作不起作用的原因。我还假设这正是自动生成列(header=“Name”)中发生的情况。
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="Tomato"/> <!-- beautiful tomato background -->
<Setter Property="Command" Value="{Binding Path=MyCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}}"/>
</Style>
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},
Path=DataContext.MyCommand}"/>