2

我正在尝试将自定义 DataGrid 列定义移动到 UserControl 中。

MyComboBoxColumn.xaml

<dg:DataGridTemplateColumn 
    x:Class="WpfDecomposition.MyComboBoxColumn"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
    x:Name="_this"
    >

    <dg:DataGridTemplateColumn.Header>
        <Button Content="{Binding MyHeader, ElementName=_this}" ></Button>
    </dg:DataGridTemplateColumn.Header>

</dg:DataGridTemplateColumn>

MyComboBoxColumn.cs

public partial class MyComboBoxColumn : DataGridTemplateColumn
{
    public MyComboBoxColumn()
    {
        InitializeComponent();
    }

    public static DependencyProperty MyHeaderProperty = 
        DependencyProperty.Register("MyHeader", typeof(string), typeof(MyComboBoxColumn), new PropertyMetadata("TEST"));
}

主窗口 XAML:

<dg:DataGrid CanUserAddRows="True" AutoGenerateColumns="False">
    <dg:DataGrid.Columns>
        <my:MyComboBoxColumn />
    </dg:DataGrid.Columns>
</dg:DataGrid>

我希望在列标题中看到一个“TEST”按钮,但我看到的是空按钮。绑定好像坏了 怎么了?

4

2 回答 2

2

它不起作用,因为它找不到名为 的元素_this。在 Visual Studio 中调试代码时,在“输出”窗口中出现以下错误:

System.Windows.Data 错误:4:找不到与引用“ElementName = _this”进行绑定的源。绑定表达式:路径=我的标题;数据项=空;目标元素是 'Button' (Name='TestButton'); 目标属性是“内容”(类型“对象”)

至于为什么找不到 - 我认为那是因为 WPF 绑定使用可视化树来查找绑定的来源。在这种情况下,MyComboBoxColumn不在可视树中,因此它找不到具有该名称的元素。

我也尝试使用RelativeSource来查找元素,但这也不起作用 - 可能出于同样的原因。

我唯一能做DataContext的就是在构造函数中将按钮的设置为列本身:

public MyComboBoxColumn()
{
    InitializeComponent();

    this.TestButton.DataContext = this;
}

然后更改 XAML 中的绑定:

<tk:DataGridTemplateColumn.Header>
    <Button Content="{Binding Path=MyHeader}" x:Name="TestButton" />
</tk:DataGridTemplateColumn.Header>

这似乎不是最好的方法,但至少它有效。

于 2009-04-01T11:39:54.957 回答
0

如果您不想或不能DataContext在构造函数中设置(例如在代码中动态创建列时),请将列的Header属性设置为您要绑定到的对象(数据上下文),然后您可以绑定到HeaderStyle数据模板中的这个对象。

有关详细信息,请参阅此问题

于 2010-10-13T08:34:32.547 回答