Добавление элементов во время выполнения в контекстное меню с привязкой к данным - PullRequest
0 голосов
/ 03 октября 2011

У меня есть требование показать список элементов в контекстном меню. В дополнение к этому мне нужно показать часто используемые элементы (настраиваемые пользователем) вверху, затем разделитель, а затем стандартный список всех элементов. Я знаю, что я могу добавить все элементы в контекстное меню во время выполнения, но я хочу изучить и другие варианты. Вопрос - возможно ли:

  1. Свяжите стандартный список в xaml, а затем добавьте часто используемые элементы во время выполнения. OR
  2. Привязать контекстное меню к двум отдельным спискам OR
  3. Любой другой лучший вариант

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

Я бы управлял своими меню в ViewModels, а не в XAML. Моя ViewModel будет отвечать за возврат коллекции, которая объединяет как стандартную коллекцию меню, так и пользовательскую коллекцию UserCollection.

Обычно я разделяю элементы со значением null и использую DataTrigger, чтобы нарисовать шаблон как разделитель, если элемент нулевой.

Примерно так:

myMenu.AddRange(UserMenu);
myMenu.Add(null);
myMenu.AddRange(StandardMenu);

и XAML ...

<ContextMenu ItemsSource="{Binding MyMenu}">
    <ContextMenu.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Template" 
                    Value="{StaticResource MyMenuItemTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding }" Value="{x:Null}">
                    <Setter Property="Template" 
                            Value="{StaticResource MySeparatorTemplate}" />
                </DataTrigger>
            </Style.Resources>
        </Style>
    </ContextMenu.Resources>
</ContextMenu>
0 голосов
/ 03 октября 2011

Второй вариант выполним, используя CompositeCollection, однако возможности привязки немного ослаблены (нельзя использовать DataContext, ElementName или RelativeSource) в CollectionContainer.Collection -Связывание.

Этот мой ответ на другой вопрос показывает два способа, которыми вы можете связать.Если вы не можете обойтись с этими ограничениями, вам придется создать составную коллекцию с выделенным кодом.

...