wpftoolkit DataGridTemplateColumn Привязка шаблона - PullRequest
0 голосов
/ 22 марта 2012

Я хочу, чтобы мои столбцы таблицы данных имели общий шаблон cell / celledit.

У меня есть решение для этого (благодаря WPF DataGridTemplateColumn shared template? ).Теперь я хотел бы улучшить читабельность, избегая вложенности всех узлов.

Мой текущий взгляд выглядит так:

  <wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">

    <wpftk:DataGrid.Resources>
      <DataTemplate x:Key="CustomCellTemplate">
        <TextBlock Text="{TemplateBinding Content}"/>
      </DataTemplate>
      <DataTemplate x:Key="CustomCellEditingTemplate">
        <TextBox Text="{TemplateBinding Content}"></TextBox>
      </DataTemplate>
    </wpftk:DataGrid.Resources>

    <wpftk:DataGrid.Columns>

      <wpftk:DataGridTemplateColumn Header="Start Date">
        <wpftk:DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <ContentPresenter ContentTemplate="{StaticResource CustomCellTemplate}" Content="{Binding StartDate}"/>
          </DataTemplate>
        </wpftk:DataGridTemplateColumn.CellTemplate>
        <wpftk:DataGridTemplateColumn.CellEditingTemplate>
          <DataTemplate>
            <ContentPresenter ContentTemplate="{StaticResource CustomCellEditingTemplate}" Content="{Binding StartDate}"/>
          </DataTemplate>
        </wpftk:DataGridTemplateColumn.CellEditingTemplate>
      </wpftk:DataGridTemplateColumn>

      <!--and again the whole block above for each columns...-->

    </wpftk:DataGrid.Columns>
  </wpftk:DataGrid>

То, чего я хотел бы достичь, - это привязать значениена уровне DataGridTemplateColumn и распространите его на уровень шаблона.Кто-нибудь знает, как это сделать?

Что я пытался сделать, это что-то вроде этого:

  <wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">

    <wpftk:DataGrid.Resources>
      <DataTemplate x:Key="CustomCellTemplate">
        <TextBlock Text="{Binding}"/>
      </DataTemplate>
      <DataTemplate x:Key="CustomCellEditingTemplate">
        <TextBox Text="{Binding}"></TextBox>
      </DataTemplate>
    </wpftk:DataGrid.Resources>

    <wpftk:DataGrid.Columns>
      <wpftk:DataGridTemplateColumn Header="Start Date" Binding="{Binding StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
      <wpftk:DataGridTemplateColumn Header="End Date" Binding="{Binding EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
    </wpftk:DataGrid.Columns>
  </wpftk:DataGrid>

Очевидно, что связывающая часть не является допустимым свойством DataGridTemplateColumn, но, возможно, играяс помощью datacontext и некоторого относительного источника мог бы добиться цели, но, честно говоря, я не могу найти способ реализовать это.

Не уверен, что то, что я хочу, возможно, и я готов принять "никоим образом выможет сделать это "в качестве ответа

ПРИМЕЧАНИЕ : TextBlock / TextBox в шаблоне только для теста (реальный шаблон намного сложнее) DataGridTextColumn не будетсделать трюк Заранее спасибо

1 Ответ

1 голос
/ 22 марта 2012

То, что вы пробовали, должно было работать, поскольку вы сократили XAML, указав DataTemplates с использованием синтаксиса свойства.

Редактировать: Извините. Я неверно истолковал ваш вопрос. Чтобы добавить привязываемое свойство к DataGridTemplateColumn без изменения или доступа к исходному коду, вы можете создать AttachedProperty.

Пример:

public class DataBindingHelper 
{

    #region AttachedBinding

    public static readonly DependencyProperty AttachedBindingProperty = DependencyProperty.RegisterAttached("AttachedBinding", typeof(Binding), typeof(DataBindingHelper), new FrameworkPropertyMetadata(null));

    public static Binding GetUseAncestorDataContext(DependencyObject d)
    {
        return (bool)d.GetValue(AttachedBindingProperty);
    }

    public static void SetUseAncestorDataContext(DependencyObject d, Binding value)
    {
        d.SetValue(AttachedBindingProperty, value);
    }

    #endregion

}

Использование:

<wpftk:DataGrid ItemsSource="{Binding Tests}" AutoGenerateColumns="False">

    <wpftk:DataGrid.Resources>
        <DataTemplate x:Key="NameTemplate">
            <TextBlock Text="{Binding}"/>
        </DataTemplate> 
        <DataTemplate x:Key="EditingTemplate">
            <TextBox Text="{Binding}"/>
        </DataTemplate>

        <DataTemplate x:Key="CustomCellTemplate">
            <ContentPresenter ContentTemplate="{StaticResource NameTemplate}" 
                              Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />
        </DataTemplate>
        <DataTemplate x:Key="CustomCellEditingTemplate">
            <ContentPresenter ContentTemplate="{StaticResource EditingTemplate}"
                              Content="{Binding Path=(helpers:DataBindingHelper.AttachedBinding), RelativeSource={RelativeSource AncestorType={x:Type wpftk:DataGridTemplateColumn}}}" />                            
        </DataTemplate>

    </wpftk:DataGrid.Resources>

    <wpftk:DataGrid.Columns>
        <wpftk:DataGridTemplateColumn Header="Start Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=StartDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
        <wpftk:DataGridTemplateColumn Header="End Date" helpers:DataBindingHelper.AttachedBinding="{Binding Path=EndDate}" CellTemplate="{StaticResource CustomCellTemplate}" CellEditingTemplate="{StaticResource CustomCellEditingTemplate}"/>
    </wpftk:DataGrid.Columns>

</wpftk:DataGrid>

Чтобы узнать больше о прикрепленных свойствах: прочитайте документацию MSDN или любую книгу WPF / C #. Это одна из самых мощных вещей в системе привязки данных в WPF.


Также, если вы хотите узнать больше об отладке и итерации приложения WPF, прочитайте мой недавний ответ на эту тему. Snoop особенно помог бы вам понять, что происходит с вышесказанным.

...