WPF декомпозиция - DataGridTemplateColumn - PullRequest
2 голосов
/ 01 апреля 2009

Я пытаюсь переместить определение пользовательского столбца 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>

Я бы ожидал увидеть кнопку «ТЕСТ» в заголовке столбца, но вместо этого я вижу пустую кнопку. Похоже, переплет сломан. Что не так?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2009

Не работает, потому что не может найти элемент с именем _this. Я получаю следующую ошибку в окне «Вывод» при отладке вашего кода в Visual Studio:

System.Windows.Data Ошибка: 4: невозможно найти источник для привязки со ссылкой 'ElementName = _this. BindingExpression: Path = 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>

Это не лучший способ сделать это, но, по крайней мере, это работает.

0 голосов
/ 13 октября 2010

Если вы не хотите или не можете установить DataContext в конструкторе (например, при динамическом создании столбцов в коде), задайте для свойства Header столбца объект, с которым вы хотите связать ( контекст данных), а затем вы можете привязать к этому объекту в шаблоне данных HeaderStyle.

Подробнее см. . .

...