【问题标题】:WPF Datagrid view header bindingWPF Datagrid 视图标题绑定
【发布时间】:2013-05-20 15:34:16
【问题描述】:

实际上我面临的问题与标题所说的略有不同。 我试着总结一下下面的问题。

Class PersonnelViewModel
{

public SelectedPersonnelItem PersonnelItemViewModel;

}

Class PersonnelItemViewModel
{

}

视图的数据上下文是A,而数据网格的项目源是SelectedPersonnelItem,它是类中的B类型属性一个。现在我想将网格列绑定到 A 类中的属性defiend。但它不能作为网格的上下文是另一个类 (B)。我该如何解决这个问题?

XAML

<DataGrid Grid.Row="1"
          SelectedItem="{Binding SelectedPersonnelItem}"
          Name="PersonnelGrid"
          ItemsSource="{Binding PersonnelGridData}"
          event:DatagridRowDoubleClickHandler.MethodName="EditRecord"
          CanUserAddRows="False">
  <DataGrid.Columns>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox IsChecked="{Binding IsItemChecked, UpdateSourceTrigger=PropertyChanged}"></CheckBox>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Header="Name/Company"
                        Binding="{Binding Name}" />
    <DataGridTextColumn Header="Qualification"
                        Binding="{Binding Qualification}" />
    <DataGridTextColumn Header="Arrival"
                        Binding="{Binding ArrivalDate}" />
    <DataGridTextColumn Header="Departure"
                        Binding="{Binding DepartureDate}" />
  </DataGrid.Columns>
</DataGrid> 

【问题讨论】:

  • 听不懂你
  • 你是如何填充你的数据网格的??
  • 从您的 XAML 中,Grid 的数据上下文是 A,ItemsSource 是 PersonnelGridData。 SelectedItem 绑定到 SelectedPersonnelItem。你能检查一下你的描述吗
  • 网格的数据上下文是 SelectedPersonnelItem,它是 PersonnelItemViewModel 的类型。
  • 如果您的 Grid 的 DataContext 是 SelectedPersonnelItem,那么它必须是 DataContext="{Binding SelectedPersonnelItem}" 而不是 SelectedItem。 SelectedItem != DataContext msdn.microsoft.com/en-us/library/…

标签: c# wpf binding header grid


【解决方案1】:

您可以使用访问父数据上下文

Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type DataGrid}}, Path=DataContext.ColumnName}" 

所以要添加一个显示A的属性的列

<DataGridTextColumn Header="Company" Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Company}"/>

【讨论】:

  • 我给了这样的东西,但它仍然不起作用。 Header="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=PersonnelViewModel.Company}"
【解决方案2】:

最后我设法让它工作了。如果我直接将该属性绑定到列标题,则它不会填充该值。

我必须这样做:

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.Header> 
        <TextBlock Text="{Binding DataContext.MyProp, 
                       RelativeSource={RelativeSource FindAncestor, 
                       AncestorType={x:Type Window}}}" /> 
    </DataGridTextColumn.Header>
</DataGridTextColumn>

【讨论】:

  • 这里的问题是&lt;DataGridTextColumn&gt; 不是 WPF 可视树的一部分,因此当它用于生成 UI 组件时,它无法像其他对象那样访问整个可视树。但是,通过指定模板,它首先在可视树中创建一个对象,该对象可以访问其他对象以进行绑定。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2011-07-10
  • 2011-08-15
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多