Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 绑定到DataGridColumnHeader.Command_Wpf_Xaml_Mvvm_Binding_Datagrid - Fatal编程技术网

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}"/>