因为ToolBarTray提供者没有itemsSource我使用工具栏作为占位符但是无法完成它。我已经创建了一个置于MainWindow的用户控件。我使用类似的东西来构建菜单作为基础,坦率地说我不知道我在做什么。我在这里也使用相同的MenuItemViewModel。但我无法得到任何工具栏。菜单很完美。
<UserControl.Resources>
<ui:ToolbarButtonFilterConverter x:Key="converter" />
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Command" Value="{Binding Path=Command}"/>
<Setter Property="Visibility" Value="{Binding Path=Visibility}"/>
<Setter Property="Content" Value="{Binding Path=BitmapName, Converter={x:Static ui:NativeImageResourceConverter.Default }}"/>
</Style>
<HierarchicalDataTemplate DataType="{x:Type menu:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}" />
</UserControl.Resources>
<ToolBarTray Grid.Row="0" VerticalAlignment="Center" >
<ToolBar Name="Toolbar1" ItemsSource="{Binding Path=ToolbarItems, Converter={StaticResource converter}, ConverterParameter=Toolbar1}"/>
<!-- here more toolbars as placeholders -->
</ToolBarTray>
</UserControl>
ToolbarViewModel似乎工作正常(绑定集合)因为在下面的转换中返回了包含6个子项的相关项,但xaml可能有问题。 ui:永远不会为应该从MenuItemViewModels创建的这些工具栏按钮调用NativeImageResourceConverter。
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
var items = value as ObservableCollection<MenuItemViewModel>;
if (parameter != null && items != null)
{
if (parameter.ToString() == "Toolbar1")
{
return items.Where(i => i.Header == "Toolbar1");
}
//...
}
return null;
}
菜单项是hiearchical,可以在MenuItemViewModel中包含子项:
public class MenuItemViewModel
{
public Visibility Visibility { get; private set; }
public string BitmapName { get; private set; }
public ICommand Command { get; private set; }
private ObservableCollection<MenuItemViewModel> _menuItems;
public ObservableCollection<MenuItemViewModel> MenuItems;
//...
}