2011-11-10 143 views
1

可能重複:
Wpf Toolkit. Bind DataGrid Column Header to DynamicResource
WPF Error: Cannot find govering FrameworkElement for target element綁定DataGrid列標題

我使用MVVM模式,所以對我的看法,我試圖將列綁定創建WPF應用程序將DataGrid列的標題添加到我的視圖模型上的屬性,該屬性是DataGrid所在視圖的數據上下文。

XAML:

<DataGrid Name="DailyData" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding Path=DailyDataViewModels}" HorizontalAlignment="Stretch"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="{Binding InflowVolumeLabel}" Binding="{Binding InflowVolume}"></DataGridTextColumn> 
        </DataGrid.Columns> 
       </DataGrid> 

但是頭只顯示了空白,似乎並不試圖綁定到指定的屬性,你怎麼可以綁定一個DataGrid列標題?

+1

@parapurarajkumar:本'BindingMarkupExtension'認爲任何無鎖值是'Path',所以是的,它是故意的,但它也是正確。 – user7116

回答

1

你已經遇到了一個整潔的問題與DataGrid.Columns集合,即他們不是同一視覺樹的成員,因此只有Binding屬性似乎工作。

我發現唯一可行的方法是將一個附加屬性添加到DataGrid,它將在數據加載後應用標頭。

public static readonly DependencyProperty ColumnHeadersProperty = 
    DependencyProperty.RegisterAttached(
     "ColumnHeaders", 
     typeof(IDictionary<string, string>), 
     typeof(DataGrid), 
     new UIPropertyMetadata(
      new Dictionary<string,string>(), 
      ColumnHeadersPropertyChanged)); 

public static IDictionary<string,string> GetColumnHeaders(DependencyObject obj) 
{ 
    return (IDictionary<string, string>)obj.GetValue(ColumnHeadersProperty); 
} 

public static void SetColumnHeaders(DependencyObject obj, 
    IDictionary<string, string> value) 
{ 
    obj.SetValue(ColumnHeadersProperty, value); 
} 

static void ColumnHeadersPropertyChanged(DependencyObject sender, 
    DependencyPropertyChangedEventArgs e) 
{ 
    var dataGrid = sender as DataGrid; 
    if (dataGrid != null && e.NewValue != null) 
    { 
     dataGrid.AutoGeneratingColumn += AddColumnHeaders; 
    } 
} 

static void AddColumnHeaders(object sender, 
    DataGridAutoGeneratingColumnEventArgs e) 
{ 
    var headers = GetColumnHeaders(sender as DataGrid); 
    if (headers.ContainsKey(e.PropertyName)) 
    { 
     e.Column.Header = headers[e.PropertyName]; 
    } 
} 

可能使用的一樣(可以改善):

// you could change it to use Column.DisplayIndex 
this.dataGrid.SetValue(
    DataGridEx.ColumnHeadersProperty, 
    new Dictionary<string, string> 
    { 
     { "PropertyName1", "Header 1" }, 
     { "PropertyName2", "Header 2" }, 
     { "PropertyName3", "Header 3" }, 
    });