У меня есть иерархический набор данных, который я привязываю к меню, и он отлично работает, но я показываю значок и имя пунктов меню в стеке, которое находятся в разделе заголовка меню, это приводит к нечетному взгляду, поскольку столбец значков связанных элементов меню не используется. Хотелось бы знать, как правильно форматировать мой XAML, поэтому значок различных связанных типов фактически привязывается к свойству IconItem's Icon, а не сидит в разделе заголовка.Использовать стили в моем иерархическом шаблоне для правильного форматирования привязок MenuItem (s)
<Menu x:Name="menu" >
<Menu.Resources>
<HierarchicalDataTemplate DataType="{x:Type ODIF:PluginContainer}">
<HierarchicalDataTemplate.ItemsSource>
<MultiBinding>
<MultiBinding.Converter>
<local:CompositeDeviceCollectionConverter />
</MultiBinding.Converter>
<Binding/>
<Binding Path="Instance.Devices"/>
</MultiBinding>
</HierarchicalDataTemplate.ItemsSource>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Image Source="{Binding PluginIcon}" Width="16" Height="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding PluginIcon}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock Text="{Binding PluginName}"/>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type ODIF:OutputDevice}" ItemsSource="{Binding InputChannels}">
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Image Source="{Binding StatusIcon}" Width="16" Height="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock Text="{Binding DeviceName}"/>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type ODIF:InputDevice}" ItemsSource="{Binding OutputChannels}">
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Image Source="{Binding StatusIcon}" Width="16" Height="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock Text="{Binding DeviceName}"/>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type ODIF:DeviceChannel}">
<local:ChannelBox Channel="{Binding}" Width="200" Click="ChannelClicked"/>
</HierarchicalDataTemplate>
</Menu.Resources>
<MenuItem x:Name="menuItem" BorderThickness="0"
Width="{Binding ActualWidth, ElementName=menu, Mode=OneWay}"
Height="{Binding ActualHeight, ElementName=menu, Mode=OneWay}"
ItemsSource="{Binding Plugins, ElementName=InputChannelBoxMenuControl}" Padding="0">
<MenuItem.Header>
<local:ChannelBox x:Name="SelectedChannelBox" Width="{Binding ActualWidth, ElementName=menuItem, Mode=OneWay}" Height="{Binding ActualHeight, ElementName=menuItem, Mode=OneWay}" Channel="{Binding SelectedChannel, ElementName=InputChannelBoxMenuControl}"/>
</MenuItem.Header>
</MenuItem>
</Menu>
UPDATE:
Редактирование HierarchicalDataTemplate.ItemContainerStyle
дает мне странное поведение, когда последний пункт меню в иерархии содержит значок корня пунктов:
А лучше более "сломать-доказательство" способ это может быть реализовано с помощью идентификатора типа IvalueConverter и проверить его, а не просто слепо проверять, существуют ли свойства. – Wobbles