2016-02-28 6 views
0

У меня есть иерархический набор данных, который я привязываю к меню, и он отлично работает, но я показываю значок и имя пунктов меню в стеке, которое находятся в разделе заголовка меню, это приводит к нечетному взгляду, поскольку столбец значков связанных элементов меню не используется. Хотелось бы знать, как правильно форматировать мой XAML, поэтому значок различных связанных типов фактически привязывается к свойству IconItem's Icon, а не сидит в разделе заголовка.Использовать стили в моем иерархическом шаблоне для правильного форматирования привязок MenuItem (s)

enter image description here

<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 дает мне странное поведение, когда последний пункт меню в иерархии содержит значок корня пунктов: enter image description here

ответ

0

Я нашел способ достижения этого на основе ответа другого пользователя, который с тех пор был удален, что потребовалось лишь немного больше изменений для работы с различными типами, которые я использую в своем b inding.

Это чувствует себя очень «хакерским», поэтому, если кто-то думает о чем-то лучшем, я надеюсь, что они опубликуют, но до тех пор я узнал, что иногда вам нужно обмануть и усилить WPF в том, что вы хотите, и надеяться, t сломать дорогу;

Добавление этого к моему корневому пункту меню Достигнуты результаты, которые я искал:

  <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Style.Resources> 
         <local:IsNullConverter x:Key="isNullConverter"/> 
         <Image x:Key="IconImage" x:Shared="False"> 
          <Image.Style> 
           <Style TargetType="{x:Type Image}"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding PluginIcon, Converter={StaticResource isNullConverter}}" Value="False"> 
              <Setter Property="Source" Value="{Binding PluginIcon}" /> 
             </DataTrigger> 
             <DataTrigger Binding="{Binding StatusIcon, Converter={StaticResource isNullConverter}}" Value="False"> 
              <Setter Property="Source" Value="{Binding StatusIcon}" /> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </Image.Style> 
         </Image> 
        </Style.Resources> 
        <Setter Property="Icon" Value="{StaticResource IconImage}" /> 
       </Style> 
      </MenuItem.ItemContainerStyle> 

и преобразователь:

public class IsNullConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (value == null); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new InvalidOperationException("IsNullConverter can only be used OneWay."); 
    } 
} 

enter image description here

+0

А лучше более "сломать-доказательство" способ это может быть реализовано с помощью идентификатора типа IvalueConverter и проверить его, а не просто слепо проверять, существуют ли свойства. – Wobbles