绑定到附属财产不起作用

时间:2014-08-22 15:06:44

标签: wpf xaml styles attached-properties

我正在尝试为DataGridColumnHeader准备模板。模板应该非常简单。

附加依赖项属性csdpp:CalendarProperties.EnumDay应该只是DataGridColumnHeader所属的特定日期,然后转换器应该只返回当天的正确标签。

如果我将AncestorType设置为DataGridTextColumn(这就是我想要的)并保留代码如下:

<Style TargetType="DataGridColumnHeader" x:Key="DayHeaderStyle">
        <Setter Property="ContentTemplate">
            <Setter.Value> 
                <DataTemplate>
                    <TextBox Text="{Binding
                    RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridTextColumn}, Mode=OneWay,
                        Path=(csdpp:CalendarProperties.EnumDay),
                    Converter={StaticResource IndexToDayLabelConverter}}"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
什么都没发生。转换器甚至没有被调用。

但如果我改变代码:

<Style TargetType="DataGridColumnHeader" x:Key="DayHeaderStyle">
        <Setter Property="ContentTemplate">
            <Setter.Value> 
                <DataTemplate>
                    <TextBox Text="{Binding
                    RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}, Mode=OneWay,
                        Path=(csdpp:CalendarProperties.EnumDay),
                    Converter={StaticResource IndexToDayLabelConverter}}"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

(由DataGrid切换的DatagridTextColumn,DataGrid也附加了属性(下))

转换器被调用,并且值从DataGrid传递附加属性。为什么这适用于DataGrid而不适用于DataGridTextColumn?请帮忙。

使用DataGrid和DataGridTextColumn的代码:

<DataGrid Grid.Row="1" Grid.Column="1" 
          x:Name="_shiftDataGrid" 
          ItemsSource="{Binding ElementName=Root, Path=PersonShiftgroupings.ShiftPersons}"
          DataContext="{Binding ElementName=Root, Path=PersonShiftgroupings.ShiftPersons}"
          AutoGenerateColumns="False"
          csdpp:CalendarProperties.EnumDay="Fri">

    <DataGrid.Columns>
        <DataGridTextColumn 
            csdpp:CalendarProperties.EnumDay="Wed"
            HeaderStyle="{StaticResource DayHeaderStyle}">
        </DataGridTextColumn>
    </DataGrid.Columns> 
</DataGrid>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

就像我在上面的评论中所述,DataGridColumnHeader是在DataGrid的VisualTree中 DataGridColumn的VisualTree中的DataGridColumnHeaderPresenter不是

您可以通过DataGridColumnHeader的Column属性访问Column Column

我并不想深入了解您的实施和逻辑,因为我确信这是一种更清洁的方式来做您需要做的事情。

以下是使其正常工作所需的示例:

CS:

  public partial class MainWindow : Window
  {
      public MainWindow()
      {
          InitializeComponent();
          this.DataContext = this;
      }

      public List<SomeItem> MyItems
      {
          get { return new List<SomeItem> { new SomeItem() , new SomeItem() , new SomeItem() , new SomeItem()  };   }
      }

  }

  public class SomeItem
  {
      public int First { get { return 1; } }
      public int Second { get { return 2; } }
      public int Third { get { return 3; } }
      public int Forth { get { return 4; } }
  }



  public static class ASample
  {
      public static string GetMyProperty(DependencyObject obj)
      {
          return (string)obj.GetValue(MyPropertyProperty);
      }

      public static void SetMyProperty(DependencyObject obj, string value)
      {
          obj.SetValue(MyPropertyProperty, value);
      }

      public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(string), typeof(ASample));            
  }

  public class ColumnHeaderConverter : IValueConverter
  {
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
          if (value == null)
              return string.Empty;

          DataGridColumn c = (DataGridColumn)value;
          string header = ASample.GetMyProperty(c);
          return header;
      }

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
          throw new NotImplementedException();
      } 
  }        

XAML:

       <Window.Resources>

    <local:ColumnHeaderConverter x:Key="colConverter"/>

    <Style TargetType="DataGridColumnHeader" x:Key="DayHeaderStyle">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBox Text="{Binding 
              RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}, Mode=OneWay,
                             Path=Column , Converter={StaticResource colConverter} }"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>


</Window.Resources>

<Grid>

    <DataGrid AutoGenerateColumns="False" ColumnHeaderStyle="{StaticResource DayHeaderStyle}" 
              ItemsSource="{Binding MyItems}" local:ASample.MyProperty="DataGrid" > 
        <DataGrid.Columns>

            <DataGridTextColumn Binding="{Binding First}" local:ASample.MyProperty="11"/>
            <DataGridTextColumn Binding="{Binding Second}" local:ASample.MyProperty="22"/>
            <DataGridTextColumn Binding="{Binding Third}"  local:ASample.MyProperty="33"/>
            <DataGridTextColumn Binding="{Binding Forth}" local:ASample.MyProperty="44"/>
        </DataGrid.Columns>
    </DataGrid>

</Grid>                      

答案 1 :(得分:0)

DataGridTextColumn不是DataGridColumnHeader的祖先