如何构建动态WPF工具栏?

时间:2015-12-14 15:05:19

标签: wpf mvvm datatemplate hierarchicaldatatemplate

因为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;
    //...
 }

0 个答案:

没有答案