wpf
  • data-binding
  • mvvm
  • datagrid
  • 2012-01-17 67 views 7 likes 
    7

    我知道这个问题已经被问过,但没有“前”的答案似乎为我工作...绑定DataGrid的列标题的DataContext

    我已经实现了我的应用程序的多语言功能,我为此必须将DataGrid列的标题绑定到DataContext。

    我使用的字典(在下面的例子中所谓的文本)在DataContext的存储文本,并结合工作正常的TextBlocks,按钮等

    <TextBlock Text="{Binding Text[Name], FallbackValue='Name'" /> 
    

    但是,我不能得到这个处理DataGrid列的Header属性。

    我在某处读过,我需要为列/头写一个模板来达到这个目的,但我无法弄清楚。

    回答

    27

    您可能需要走回来了树得到的DataContext你想要的:

    <DataGridTextColumn Binding="{Binding Name}"> 
        <DataGridTextColumn.HeaderTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding DataContext.Text[Name], 
             RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
         </DataTemplate> 
        </DataGridTextColumn.HeaderTemplate> 
    </DataGridTextColumn> 
    

    Header财产直接这样做是行不通的,因为它不能就地解决的列是没有出现在树中的抽象对象。

    +0

    谢谢。这很好用! – 2012-01-17 09:48:25

    +1

    Header vs HeaderTemplate是关键。谢谢。 – 2013-07-24 07:42:49

    +0

    的确相对来源确实如此。伟大的thx! – 2017-04-12 12:30:09

    3

    正确。 在视觉树中没有元素,直接映射到DataGridTextColumn,所以你不能使用RelativeSourceAncestorType(即DataGridTextColumn不是控件,因此它没有父控件)。 下面的代码应该可以正常工作

    <DataGridTextColumn Binding="{Binding Name}"> 
        <DataGridTextColumn.Header> 
        <TextBlock Text="{Binding DataContext.Text[Name], 
             RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
        </DataGridTextColumn.Header> 
    </DataGridTextColumn> 
    
    +0

    谢谢,这比HeaderTemplate解决方案更不痛苦,它仍然有效。但是有没有办法使用'Header =“{Some stringified binding}”'属性来做同样的技巧? – 2013-12-17 11:40:12

    +0

    很好的解释,谢谢。 – rPulvi 2014-09-09 14:00:23

    +0

    在.NET 4.5和4.6上尝试了这一点,并且它在工作的时候,导致了不一致的行为,当绑定对象更新时,DataGrid不能可靠地更新。虽然接受的答案中的方法确实一致。 – fuglede 2017-07-20 16:49:16

    相关问题