Я хочу создать шаблонный стиль для сеток данных, который будет иметь контекстное меню по умолчанию с использованием 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) говорит мне, что значение моего присоединенного свойства неверно.
Я попытался поместить коллекцию непосредственно в стиль, она работает нормально, но без использования присоединенного свойства система теряет интерес.
Кто-нибудь имеет представление о том, что я делаю неправильно?