Привязка свойства ContextMenu к свойству владельца

У меня проблема с привязкой контекстного меню к прикрепленному свойству текстового поля. Итак, у меня есть TextBox, и у него есть контекстное меню при щелчке правой кнопкой мыши. Итак, как связать свойство контекстного меню с прикрепленным свойством TextBox в WPF XAML? Здесь я пытаюсь привязаться к TextBox, но это не помогает

 <Style x:Key="DefaultTextBox" TargetType="{x:Type TextBox}">
        <Setter Property="BorderBrush" Value="{DynamicResource ThemeSecondary}"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu x:Name="uiContexMenu">
                    <ContextMenu.ItemsSource>
                        <CompositeCollection>
                            <MenuItem Command="Cut" Header="Cut">
                                <MenuItem.Icon>
                                    <Viewbox Width="16" Height="16">
                                        <TextBlock FontFamily="{DynamicResource IconFont}" Text=""/>
                                    </Viewbox>
                                </MenuItem.Icon>
                            </MenuItem>
                            <MenuItem Command="Copy" Header="Copy">
                                <MenuItem.Icon>
                                    <Viewbox Width="16" Height="16">
                                        <TextBlock FontFamily="{DynamicResource IconFont}" Text=""/>
                                    </Viewbox>
                                </MenuItem.Icon>
                            </MenuItem>
                            <MenuItem Command="Paste" Header="Paste">
                                <MenuItem.Icon>
                                    <Viewbox Width="16" Height="16">
                                        <TextBlock FontFamily="{DynamicResource IconFont}" Text=""/>
                                    </Viewbox>
                                </MenuItem.Icon>
                            </MenuItem>
                            <CollectionContainer Collection="{Binding  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TextBox}, Path=Extensions.ExtendCommands}"/>
                        </CompositeCollection>
                    </ContextMenu.ItemsSource>
                </ContextMenu>
            </Setter.Value>
        </Setter>

Моя прикрепленная собственность:

 #region ExtendCommands dependency property

        public static IEnumerable GetExtendCommands(DependencyObject obj)
        {
            return (IEnumerable)obj.GetValue(ExtendCommandsProperty);
        }

        public static void SetExtendCommands(DependencyObject obj, IEnumerable value)
        {
            obj.SetValue(ExtendCommandsProperty, value);
        }

        // Using a DependencyProperty as the backing store for ExtendCommands.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ExtendCommandsProperty =
            DependencyProperty.RegisterAttached("ExtendCommands", typeof(IEnumerable), typeof(Extensions), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

        #endregion

Спасибо


person Qutfullo Ochilov    schedule 17.09.2016    source источник
comment
Добавьте сюда немного кода, чтобы его было легко понять   -  person Jamaxack    schedule 17.09.2016
comment
взгляните на этот ответ: stackoverflow.com/questions/3878620/. Свойство PlacementTarget в контекстном меню — это то, что вы хотите?   -  person Jamaxack    schedule 17.09.2016
comment
Спасибо @Jamaxack, но это не помогает. Я пытаюсь привязать к прикрепленному имуществу владельца!   -  person Qutfullo Ochilov    schedule 17.09.2016
comment
Не могли бы вы показать часть своего кода, где вы устанавливаете указанное прикрепленное свойство для TextBox?   -  person Grx70    schedule 18.09.2016


Ответы (2)


Плохая новость: у CollectionContainer нет DataContext. В привязке вы можете использовать только Source={x:reference XXX}. XXX должен быть инициализирован вне вашего словаря стилей/ресурсов.

Что ты можешь сделать:

Чтобы привязать что-то, имеющее DataContext, к присоединенному свойству TextBox: Установите TextBox как DataContext для ContextMenu. Таким образом, вы можете использовать свойство PlacementTarget, так как ваше контекстное меню висит на вашем TextBox. Дальше можно нормально привязать.

<ContextMenu x:Name="uiContexMenu" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">

<ComboBox ItemsSource="{Binding Path=(local:Extensions.ExtendCommands)}"/>
...
</ContextMenu>

И, конечно же, вы должны установить прикрепленное свойство:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
<TextBox Text="***" Style="{StaticResource DefaultTextBox}">
                <local:Extensions.ExtendCommands>
                    <x:Array Type="{x:Type sys:String}">
                        <sys:String>Text 1</sys:String>
                        <sys:String>Text 2</sys:String>
                        <sys:String>Text 3</sys:String>
                    </x:Array>
                </local:Extensions.ExtendCommands>
            </TextBox>
person Rekshino    schedule 28.03.2017

Это общая проблема с ContextMenu, так как он не всегда имеет контекст данных предполагаемого родителя. Для получения дополнительной информации прочитайте о контексте наследования https://blogs.msdn.microsoft.com/nickkramer/2006/08/17/whats-an-inheritance-context/

Как упоминалось в комментариях к указанному сообщению в блоге, вам, вероятно, необходимо явно установить контекст данных контекстного меню в текстовое поле.

person lhildebrandt    schedule 05.10.2016