2010-09-28 125 views
0

我想將我的datagrid頭綁定到網格的DataContext上的屬性。現在,我得到它的工作,但我認爲這是一個臨時的解決方案:如何從DataGridColumn.Header綁定到ViewModel屬性?

<DataGrid x:Name="grid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Description}"> 
       <DataGridTextColumn.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding ElementName=grid, Path=DataContext.ItemsUnit}"></TextBlock> 
        </DataTemplate> 

這種解決方案的最大的問題是,它使結合更脆弱(上下文敏感的)。如果網格的DataContext用於主/細節場景(使DataContext成爲BindingList而不是單個項目),則必須用DataContext={Binding /}替換更新DataGrid DataContext。

從DataGrid.HeaderTemplate綁定比使用ElementName並引用DataContext更強健的方法嗎?

回答

0

一個簡單的解決辦法是使用一個名爲資源

<UserControl.Resources> 
    <ResourceDictionary> 
    <MyNamespace:MyHeaderProvider x:Key="MyHeaderProvider"> 
    </ResourceDictionary> 
</UserControl.Resources> 

... 

Header="{Binding Path=HeaderText, Source={StaticResource MyHeaderProvider}" 

如果一切真的是動態的,這可能無法正常工作。當我使用更多動態/數據驅動列創建網格時,我沒有在XAML中定義它們,而是在後面的代碼中生成它們,而不必在DataContext中執行相關操作。

+0

這是如何工作的?標題中的信息是從ViewModel(綁定到Grid DataContext)的屬性獲取的,來自靜態源的Noe(如標題信息提供者) – Marius 2010-09-28 19:22:04

+0

您在哪裏創建Grid的DataContext? 我提到的替代方案(在CS文件中創建列定義,而不是XAML)可能對您更好。 – 2010-09-28 20:14:22

+0

這裏是關於做動態列創建的兩個不錯的資源:http://elegantcode.com/2010/03/08/silverlight-datagrid-populate-dynamic-columns-from-a-child-collection/ AND http:// www .silverlightshow.net /項目/定義 - Silverlight的DataGrid的-列-AT-Runtime.aspx – 2010-09-28 20:26:56

相關問題