2012-03-22 73 views
0

我想要我的datagrid列共享单元/ celledit模板。wpftoolkit DataGridTemplateColumn模板绑定

我有解决方案做到这一点(感谢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> 

显然绑定porperty不是DataGridTemplateColumn的有效属性,但也许用在DataContext和一些相对源播放可以做的伎俩,但坦率地说我无法找到实现这一点的方法。

不知道如果我想是可能的,我愿意接受一个“没有办法,你可以做到这一点”作为回答

注意:模板中的TextBlock/TextBox只是为了测试(真正的模板要复杂得多)DataGridTextColumn不会做的伎俩 在此先感谢

回答

1

你尝试过什么应该有工作,你通过使用属性语法指定DataTemplates降低XAML

编辑:对不起。我误解了你的问题。要在不修改或访问源代码的情况下向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 documentation或任何WPF/C#的书。它们是WPF中数据绑定系统最强大的功能之一。


另外,如果你想知道更多关于调试和迭代一个WPF应用程序读取我最近的话题answer。 Snoop尤其会帮助你理解上述问题。

+0

不知道我跟着你,我的问题是,我不知道如何直接从DataGridTemplateColumn绑定实际数据,绑定不是DataGridTemplateColumn的属性。我可以绑定编辑模板和普通模板,但我不知道如何将数据绑定到模板。我的猜测是用我想要的数据设置模板的DataContext,但我不知道该怎么做 – Guillaume 2012-03-23 10:12:15

+0

编辑答案以更好地回答您的原始问题。 – Dennis 2012-03-23 11:45:41

+0

太棒了!那是我在找的东西 – Guillaume 2012-03-23 11:56:14