0
我有一个层次集的数据绑定到菜单,它工作正常,但我显示的菜单项图标和名称在一个stackpanel都在菜单的标题部分,因为绑定的菜单项的图标列没有被使用,所以这会导致奇怪的外观。想知道如何正确格式化我的XAML,以便各种绑定类型的图标实际上绑定到MenuItem的Icon属性,而不是坐在Header部分。在我的HierarchicalDataTemplate中使用样式来正确地格式化我的MenuItem绑定
<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