2013-06-24 7 views
0

У меня есть стиль Appication уровня для ComboBoxItem:Как удалить привязку, определенную в стиле приложения?

<Style TargetType="{x:Type ComboBoxItem}" x:Key="DefaultComboBoxItemStyle"> 
    <!-- ... --> 
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
    <!-- ... --> 
</Style> 

<Style TargetType="{x:Type ComboBoxItem}" BasedOn="{StaticResource DefaultComboBoxItemStyle}" /> 

Этот стиль подходит для меня в 99% случаев. Но, есть 1%, когда связанные объекты не имеют свойства IsSelected. Я хочу переопределить эту привязку (в частности, полностью ее очистить).

Я думал, что это будет возможно так:

 <!-- somewhere in application code --> 
     <ComboBox Margin="5" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"> 
      <ComboBox.ItemContainerStyle> 
       <Style TargetType="ComboBoxItem" BasedOn="{StaticResource DefaultComboBoxItemStyle}"> 
        <Setter Property="IsSelected" Value="False"/> 
       </Style> 
      </ComboBox.ItemContainerStyle> 
     </ComboBox> 

Но это не работает, ошибки связывания все еще присутствует. Есть ли способ достичь того, что я хочу в XAML?

ответ

1

Вместо установки ItemContainerStyle для ComboBoxes не по умолчанию, вы можете создать другой стиль в по умолчанию в местной Resources:

<Window.Resources> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
     ... 
    </Style> 
</Window.Resources> 
... 
<ComboBox ...> 
    <ComboBox.Resources> 
     <!-- local default style based on "global" default style --> 
     <Style TargetType="ComboBoxItem" 
       BasedOn="{StaticResource ResourceKey={x:Type ComboBoxItem}}"> 
      <Setter Property="IsSelected" Value="False"/> 
     </Style> 
    </ComboBox.Resources> 
</ComboBox> 
+0

Спасибо, я попробую чуть позже. Но тогда возникает следующий вопрос: почему стиль из ресурсов должен заменить стиль приложения, но напрямую установить стиль не делает этого? – Dennis

+0

По-видимому, стиль по умолчанию всегда применяется независимо от того, что другой стиль установлен позже, когда ComboBox создал новый экземпляр ComboBoxItem и применяет свой «ItemContainerStyle». – Clemens

+0

Отлично, это работает для меня. Еще раз спасибо! – Dennis

0

Вы можете установить fallback value к ложным в вашем приложении - стиль уровня ,

<Style TargetType="{x:Type ComboBoxItem}" x:Key="DefaultComboBoxItemStyle"> 
    <!-- ... --> 
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, FallbackValue=False}" /> 
    <!-- ... --> 
</Style> 

EDIT: Попробуйте значение FALLBACK в сочетании с Priority Binding, чтобы избежать связывания ошибок.

изменен стиль приложения будет выглядеть

<Style TargetType="{x:Type ComboBoxItem}" x:Key="DefaultComboBoxItemStyle"> 
    <!-- ... --> 
    <Setter Property="IsSelected"> 
     <Setter.Value> 
      <PriorityBinding FallbackValue="False"> 
       <Binding Path="IsSelected" Mode="TwoWay" /> 
      </PriorityBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Вы пытались ли исчезнуть ошибка привязки? – Clemens

+0

Ну, я хочу привязать двигатель, даже не пытаюсь работать со связыванием. – Dennis

+1

@Clemens: Да. Подробнее см. – SKG