У меня был тот же вопрос, и хотя я не нашел ответ, который хотел, я нашел обходной путь, который удовлетворит мои потребности. Я подумал, что вам понравится это увидеть, даже после стольких затяжных событий.
Похоже, что если 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
элемента меню, чтобы сохранить ссылку на мою модель представления, чтобы я мог ссылаться на невизуальные данные в ней во время события щелчка.
Это решение удобно, поскольку оно все еще обеспечивает некоторое разделение между пользовательским интерфейсом и моделью представления, хотя я бы предпочел в этом случае чисто декларативное решение.
Надеюсь, это поможет!