将WPF数据网格列标头绑定到后面代码中的属性

本文关键字:代码 属性 绑定 数据 WPF 数据网 网格 | 更新日期: 2023-09-27 17:49:40

谁能告诉我这是可能的吗?我有一个WPF数据网格,我想将数据网格的列标头绑定到后面代码中的属性/字段。

所以这是我所尝试的。这是我的列代码。

<DataGridTextColumn  Header="{Binding ElementName=frmAssetPPM, Path=HeaderProperty}" 

这是我添加到窗口xaml的内容。

<Window .... Name="frmAssetPPM">

这是我在代码后面的属性定义:

private const string HeaderPropertyConstant = "Property";
private string _headerProperty = HeaderPropertyConstant;
public string HeaderProperty 
{
    get { return _headerProperty; }
    set { _headerProperty = value; }
}

然而,当我运行应用程序时,我在VS.

的输出窗口中显示了这个错误消息。
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=HeaderProperty; DataItem=null; target element is 'DataGridTextColumn' (HashCode=47624635); target property is 'Header' (type 'Object')
谁能告诉我我做错了什么?或者我能不能做到?我在某处读到,列是一个单独的对象,这有时会导致复杂性。

将WPF数据网格列标头绑定到后面代码中的属性

有些东西很难绑定,因为它们不是Visual树的一部分,例如弹出窗口或数据网格头。一个众所周知的解决方案是使用Josh Smith的DataContextSpy。基本上你将它实例化为一个资源并给它绑定。然后在其他地方使用该实例,在那里您可以利用它的数据上下文。网络上有很多例子,但是为了让你开始,像这样的东西应该可以工作。

<DataGrid.Resources>
    <DataContextSpy x:Key="dcSpy" 
                    DataContext="{Binding  ElementName=frmAssetPPM, Path=HeaderProperty}"/>
 ....

,那么你的绑定将工作:

<DataGridTextColumn  Header="{Binding Source={StaticResource dcSpy}, Path=DataContext}" 

如果你在网上找不到,这里是Josh Smith的代码:

public class DataContextSpy : Freezable
{
    public DataContextSpy ()
    {
        // This binding allows the spy to inherit a DataContext.
        BindingOperations.SetBinding (this, DataContextProperty, new Binding ());
    }
    public object DataContext
    {
        get { return GetValue (DataContextProperty); }
        set { SetValue (DataContextProperty, value); }
    }
    // Borrow the DataContext dependency property from FrameworkElement.
    public static readonly DependencyProperty DataContextProperty = FrameworkElement
        .DataContextProperty.AddOwner (typeof (DataContextSpy));
    protected override Freezable CreateInstanceCore ()
    {
        // We are required to override this abstract method.
        throw new NotImplementedException ();
    }
}