Как связать вложенное свойство с дочерним элементом - PullRequest
0 голосов
/ 07 января 2019

Я хочу создать шаблонный стиль для сеток данных, который будет иметь контекстное меню по умолчанию с использованием ItemsSource из присоединенного свойства. проблема в том, что моя привязка не работает, потому что найденное значение присоединенного свойства всегда равно 0.

мои пункты контекстного меню находятся в коллекции

public class PaginatedCollection<T> : ObservableCollection<T>
{
   public ObservableCollection<ContextMenuItem> CollectionContextMenu { get; set; }
}

эта коллекция является дочерней для настраиваемой наблюдаемой коллекции, которая используется в качестве ItemSource для сетки данных

его конструктор всегда создает два элемента для CollectionContextMenu:
- ExcelExport
- CopyValue

Я создал прикрепленное свойство:

public class DataGridContextMenu : DependencyObject
{
    public static ObservableCollection<ContextMenuItem> GetContextMenuItems(DependencyObject contextMenuItemsProperty)
    {
        return (ObservableCollection<ContextMenuItem>)contextMenuItemsProperty.GetValue(ContextMenuItemsProperty);
    }

    public static void SetContextMenuItems(DependencyObject contextMenuItemsProperty, ObservableCollection<ContextMenuItem> value)
    {
        contextMenuItemsProperty.SetValue(ContextMenuItemsProperty, value);
    }

    // Using a DependencyProperty as the backing store for ContextMenuItems.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ContextMenuItemsProperty =
        DependencyProperty.Register("ContextMenuItems", typeof(ObservableCollection<ContextMenuItem>), typeof(DataGridContextMenu), new UIPropertyMetadata(null));

}

Я также определил эти стили:

<Style x:Key="ContextMenuItemStyle" TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
  <Setter Property="MenuItem.Header" Value="{Binding Header}"/>
  <Setter Property="MenuItem.ToolTip" Value="{Binding ToolTip}"/>
  <Setter Property="MenuItem.Icon" Value="{Binding Icone}"/>
  <Setter Property="MenuItem.Command" Value="{Binding Command}"/>
  <Setter Property="MenuItem.CommandParameter" Value="{Binding CommandParameter}"/>
</Style>
<Style x:Key="GridWithContext" TargetType="{x:Type DataGrid}" BasedOn="{StaticResource MaterialDesignDataGrid}">
  <Setter Property="ContextMenu">
    <Setter.Value>
      <ContextMenu ItemsSource="{Binding Path=(ap:DataGridContextMenu.ContextMenuItems), UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}" ItemContainerStyle="{StaticResource ContextMenuItemStyle}" />
    </Setter.Value>
  </Setter>
</Style>

и я использую это в моем файле xaml:

<DataGrid x:Name="dg_affaires" ItemsSource="{Binding Path=Collection, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource GridWithContext}" ap:DataGridContextMenu.ContextMenuItems="{Binding Collection.CollectionContextMenu, UpdateSourceTrigger=PropertyChanged}"/>

при этом контекстное меню не отображается. Я знаю, что проблема связана с привязкой стиля сетки данных.
Я нашел эту ошибку, используя snoop:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=(0); DataItem=null; target element is 'ContextMenu' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

Path = (0) говорит мне, что значение моего присоединенного свойства неверно.

Я попытался поместить коллекцию непосредственно в стиль, она работает нормально, но без использования присоединенного свойства система теряет интерес.

Кто-нибудь имеет представление о том, что я делаю неправильно?

...