2011-04-11 104 views
0

我尝试从DataTemplate绑定到myGridViewColumn。我想在网格视图标题中显示自定义文本(如'Caption =“Name”'),但它不起作用!WPF从DataTemplate绑定到GridViewColumn

XAML的DataTemplate:

<Window x:Class="DataTemplateTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:my="clr-namespace:DataTemplateTest" Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate x:Key="System3" DataType="{x:Type my:MyGridViewColumn}"> 
      <StackPanel Grid.Column="0" Margin="2" Orientation="Horizontal"> 
       <TextBlock Text="113 " Foreground="Red"/> 
       <TextBlock Text="{Binding Path=Caption}"/> 
       <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:MyGridViewColumn}}, Path=Caption}"/> 
       <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Caption}"/> 
      </StackPanel> 
     </DataTemplate>  
    </Window.Resources> 
    <Grid> 
     <ListView 
      Height="auto" 
      SelectionMode="Single" 
      Name="lstvMain" 
      > 
      <ListView.View> 
       <GridView> 
        <my:MyGridViewColumn HeaderTemplate="{StaticResource ResourceKey=System3}" Width="150" Caption="Name" DisplayMemberBinding="{Binding Path=Name}"/> 
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
        <GridViewColumn Header="Surname" DisplayMemberBinding="{Binding Path=Surname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 

和C#代码

#region code 
using System; 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 

namespace DataTemplateTest 
{ 
    public partial class MainWindow 
    { 
     public List<User> Users = new List<User> { new User { Name = "John", Surname = "Smith" }, new User { Name = "Joe", Surname = "Brown" } }; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      lstvMain.ItemsSource = Users; 
     } 
    } 
    public class User : DependencyObject 
    { 
     public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(String), typeof(User), new PropertyMetadata(String.Empty)); 
     public String Name 
     { 
      get { return (String)GetValue(NameProperty); } 
      set 
      { 
       SetValue(NameProperty, value); 
       OnPropertyChanged(new DependencyPropertyChangedEventArgs(NameProperty, null, value)); 
      } 
     } 

     public static DependencyProperty SurnameProperty = DependencyProperty.Register("Surname", typeof(String), typeof(User), new PropertyMetadata(String.Empty)); 
     public String Surname 
     { 
      get { return (String)GetValue(SurnameProperty); } 
      set 
      { 
       SetValue(SurnameProperty, value); 
       OnPropertyChanged(new DependencyPropertyChangedEventArgs(SurnameProperty, null, value)); 
      } 
     } 
    } 
    public class MyGridViewColumn : GridViewColumn 
    { 
     public static DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(String), typeof(MyGridViewColumn), new PropertyMetadata(String.Empty)); 
     public String Caption 
     { 
      get { return (String)GetValue(CaptionProperty); } 
      set 
      { 
       SetValue(CaptionProperty, value); 
       OnPropertyChanged(new DependencyPropertyChangedEventArgs(CaptionProperty, null, value)); 
      } 
     } 
    } 
} 
#endregion 

任何帮助将不胜感激!

回答

3

您定义的HeaderTemplate,但没有Header,所以模板没有DataContext

但无论如何,你将不能够直接与绑定定义标题,因为GridViewColumn不继承DataContext 。我写了一篇关于解决这个问题的解决方案here

+0

非常感谢!这个问题让我很生气,因为我尝试过使用“RelativeSource FindAncestor”,但它没有任何效果......奇怪的是,该列不属于视觉或逻辑树。无论如何感谢快速和有益的答案! :) – 2011-04-13 09:38:01

相关问题