绑定 DataGrid 列标题 [重复]

Posted

技术标签:

【中文标题】绑定 DataGrid 列标题 [重复]【英文标题】:Bind DataGrid Column Header [duplicate] 【发布时间】:2011-12-25 20:45:39 【问题描述】:

可能重复:Wpf Toolkit. Bind DataGrid Column Header to DynamicResourceWPF Error: Cannot find govering FrameworkElement for target element

我正在使用 MVVM 模式创建一个 WPF 应用程序,因此在我的视图中,我试图将 DataGrid 列的列标题绑定到我的视图模型上的属性,这是 @ 视图的数据上下文987654324@在。

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 列标题?

【问题讨论】:

@parapurarajkumar:BindingMarkupExtension 认为任何未键入的值都是Path,所以是的,这是故意的,但它也是正确的。 【参考方案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" ,
    );

【讨论】:

以上是关于绑定 DataGrid 列标题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Winforms 项目中使用 DataGrid 中的复选框列

wpf datagrid怎么得到第一项焦点?然后在方向键上下移动

怎么把数据库中的数据通过jquery easyui datagrid进行绑定绑定

EasyUI之datagrid的使用

绑定 datagrid 列可见性 MVVM

如何观察 DataGrid 的单元格被编辑的事件?