Как привязать пункты меню к ContextMenu в silverlight, включая значок - PullRequest
2 голосов
/ 29 октября 2010

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

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </controlsInputToolkit:ContextMenu.ItemTemplate>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

, но есть одна проблема, ItemTemplate представляет область текста элемента меню и, насколько мне известно, не позволяет установить значок

, поэтому япопытался выполнить привязку через ItemContainerStyle, как в примере ниже

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemContainerStyle>
                <Style TargetType="controlsInputToolkit:MenuItem">
                    <Setter Property="Header" Value="{Binding Name}"/>
                </Style>
            </controlsInputToolkit:ContextMenu.ItemContainerStyle>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

, но Silverlight, похоже, не нравится

какие-либо идеи?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2010

Попробуйте вместо этого использовать это меню с открытым исходным кодом:

http://sl4popupmenu.codeplex.com

Шаблон позволяет напрямую связывать изображения. Надеюсь, это поможет.

0 голосов
/ 05 марта 2011

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

Похоже, что если ItemsSource класса ContextMenu содержит MenuItem объектов, то значок приземлится на свое место. Я, как и вы, использовал модель представления и не знал, что делать, чтобы внедрить логику пользовательского интерфейса в мой класс модели представления.

Вместо этого я реализовал преобразователь значений, чтобы преобразовать мою модель представления в MenuItem объекты. Это выглядело примерно так:


XAML:

<UserControl.Resources>
    <local:DelegatedValueConverter
        x:Key="LocalContextItemConverter"
        Converting="OnBindingContextMenu" />
</UserControl.Resources>

...

<toolkit:ContextMenu
    ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />

C # Code-Behind

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}

Обсуждение

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

Свойство Title моей модели представления является строкой, а Icon является экземпляром Image. Я использую свойство Tag элемента меню, чтобы сохранить ссылку на мою модель представления, чтобы я мог ссылаться на невизуальные данные в ней во время события щелчка.

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

Надеюсь, это поможет!

0 голосов
/ 29 октября 2010

Я создаю контекстное меню программно и задаю содержимое для свойства MenuItem.Header, кажется, отлично работает для изображений. Есть лот из примеров текста настроек.

...