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

可能重复:
Wpf Toolkit. Bind DataGrid Column Header to DynamicResource
WPF 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,所以是的,这是故意的,但它也是正确的。

标签: .net wpf xaml mvvm .net-4.0


【解决方案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" },
    });

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2011-01-12
    • 2023-03-07
    • 2012-02-12
    • 2011-04-13
    • 2018-02-28
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多