wpf
  • data-binding
  • mvvm
  • datagrid
  • 2012-01-17 68 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

    相關問題