WPF分解 - DataGridTemplateColumn

时间:2009-04-01 11:07:17

标签: wpf wpftoolkit datagridtemplatecolumn

我正在尝试将自定义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”按钮,但我会看到空按钮。看起来绑定被打破了。有什么问题?

2 个答案:

答案 0 :(得分:2)

它无法正常工作,因为找不到名为_this的元素。我在Visual Studio中调试代码时,在输出窗口中出现以下错误:

  

System.Windows.Data错误:4:不能   找到与参考绑定的源   '的ElementName = _this'。   BindingExpression:路径= MyHeader;   的DataItem = NULL;目标元素是   '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>

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

答案 1 :(得分:0)

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

有关详细信息,请参阅this question