2011-11-10 40 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列ヘッダを

<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> 

バインドすることができますか?

+1

@parapurarajkumar: 'BindingMarkupExtension'はそうです、それは意図的であるが、それもあり、任意のキーなし値は' PATH'とみなす可能性(向上させることができる)ように使用

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]; } } 

正しい。 – user7116

答えて

1

DataGrid.Columnsコレクションでは、同じビジュアルツリーのメンバーではないため、Bindingプロパティのみが動作するように見えます。

私が見つけた唯一のアプローチは、データがロードされた後にヘッダを適用するDataGridに添付プロパティを追加することです。

// 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" }, 
    }); 
関連する問題