【问题标题】:Binding to attached property not working绑定到附加属性不起作用
【发布时间】:2014-08-22 15:06:43
【问题描述】:

我正在尝试为 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也有附加属性(下))

Converter 被调用,并且作为值从 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>

任何帮助将不胜感激。

【问题讨论】:

  • 这是因为 DataGridColumn 不在 DataGrid 的 VisualTree 中, DataGridColumnHeader 是,我不知道在这种情况下如何编写绑定,它会涉及一些试验和错误,你可以给我一个示例?这是 DataGridColumnHeader 中的 Column 属性:msdn.microsoft.com/en-us/library/…

标签: wpf xaml styles attached-properties


【解决方案1】:

就像我在上面的评论中所说的那样,DataGridColumnHeader 在 DataGrid 的 VisualTree 中,通过 DataGridColumnHeaderPresenternot 在 DataGridColumn 的 VisualTree 中。

你可以通过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>                      

【讨论】:

  • 这是缺失的部分。谢谢!
【解决方案2】:

DataGridTextColumn 不是 DataGridColumnHeader 的祖先

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2011-11-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多