2016-12-15 2 views
0

У меня есть следующие MenuItem в WPF:Доступ Свойство объекта привязан к ItemsSource

<MenuItem 
    x:Name="Menu1" 
    ItemsSource="{Binding ListOfObject1}" Visibility="{Binding ListOfObject1, Converter={u:NullToVisibleConverter}}" 
    > 
    <MenuItem.Style> 
     <Style> 
      <Setter 
       Property="Control.IsEnabled" 
       Value="true" 
       /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition 
          Binding="{Binding PropertyInViewModel, Converter={baseTc:IsNullConverter} }" 
          Value="true" 
          /> 
         <Condition 
          Binding="{Binding ElementName=Menu1, Path=Items.BoolInObject1}" 
          Value="True" 
          /> 
        </MultiDataTrigger.Conditions> 
        <Setter 
         Property="Control.IsEnabled" 
         Value="False" 
         /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </MenuItem.Style> 
</MenuItem> 

Так я хочу, чтобы мой MenuItem быть IsEnabled=false, если свойство PropertyInViewModel равно нулю и свойство BoolInObject1 верно. DataContext установлен в ViewModel. Объект Object1 определен в другом месте. Поэтому в основном мое второе условие не работает, т. Е. Мне нужно получить доступ к свойству элемента/объекта из источника items, чтобы проверить, включен ли этот элемент или нет. Может кто-нибудь объяснить мне, как это сделать? Итак, как определить второе условие для доступа к свойствам объектов, связанных с ItemsSource. Спасибо заранее.

+0

Кстати, если только эти условия, вы можете добавить 'Setter' отключить по умолчанию, а затем добавьте две одинарные связывания DataTriggers: один, что позволяет, если' PropertyInViewModel' не '{х: Null } ', и один, который позволяет, если' whatnot.BoolInObject1' является ложным. Таким же логическим результатом. –

+0

Его мультитатригергер не мультиплексирует, я думаю, что мне не нужно иметь мультиконвертер, как я уже указал условия, не так ли? Object1 - это открытый класс, определенный в моем решении. Поэтому, конечно, это ссылка на ListOfObject1, I.e. его тип списка. – SQLStarter

+0

Ой, ты прав. Нет необходимости в мультиконвертере. –

ответ

0

Элементы детского меню не наследуют, что Style. Способ, которым вы применяете Style к элементам детского меню, - MenuItem.ItemContainerStyle, точно также как ListBox или ListView; все эти классы наследуют это свойство от ItemsControl вместе с имуществом ItemsSource и несколькими другими.

Каждый элемент детского меню будет иметь один из ListOfObject1 элементов для DataContext, поэтому привязка BoolInObject1 проста. Связывание PropertyInViewModel сложнее, потому что модель не будет DataContext. Тем не менее, это DataContext родителя MenuItem, который вы можете получить через визуальное дерево, используя {RelativeSource AncestorType=MenuItem}.

Я также добавил сеттер для свойства элементов детского меню ; вы, естественно, должны изменить свойство, которое связано. И я добавил TargetType на ваш Style.

<MenuItem 
    x:Name="Menu1" 
    ItemsSource="{Binding ListOfObject1}" 
    Visibility="{Binding ListOfObject1, Converter={u:NullToVisibleConverter}}" 
    > 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter 
       Property="IsEnabled" 
       Value="true" 
       /> 
      <Setter 
       Property="Header" 
       Value="{Binding SomePropertyOfItemClass}" 
       /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition 
          Binding="{Binding PropertyInViewModel, Converter={baseTc:IsNullConverter}, RelativeSource={RelativeSource AncestorType=MenuItem}}" 
          Value="true" 
          /> 
         <Condition 
          Binding="{Binding BoolInObject1}" 
          Value="True" 
          /> 
        </MultiDataTrigger.Conditions> 
        <Setter 
         Property="IsEnabled" 
         Value="False" 
         /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 
+0

Спасибо, это выглядит многообещающе. Я проверю его как можно скорее и пометьте свой ответ. Спасибо, это заняло меня сейчас. – SQLStarter

+0

Итак, этот родственник-источник предков, что он делает подробно? Установил ли он datacontext в datacontext предка? – SQLStarter

+0

@SQLStarter Одним словом, нет. Это означает, что вместо перехода к 'DataContext' для поиска свойства, указанного' Path', он переходит к предку и ищет его там. Если он изменил 'DataContext'' MenuItem', который не мог работать, у вас есть два 'Binding' здесь с двумя разными источниками; который выиграет? –