2013-09-04 5 views
2

для UserControl я объявлен DependencyProperty:Пользовательские DependencyProperty на Style.Trigger

 public static readonly DependencyProperty DeselectedPresentationModeProperty = 
     DependencyProperty.Register(
     "DeselectedPresentationMode", 
     typeof(int), 
     typeof(MyUserControl), 
     new FrameworkPropertyMetadata(1,FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public static readonly DependencyProperty SelectedPresentationModeProperty = 
     DependencyProperty.Register(
     "SelectedPresentationMode", 
     typeof(int), 
     typeof(MyUserControl), 
     new FrameworkPropertyMetadata(1, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

Теперь я хочу, чтобы использовать эти свойства в MultiTrigger:

<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}" x:Key="MyUserControlItemStyle"> 
     <Style.Triggers> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="False" /> 
        <Condition Property="gui:MyUserControl.DeselectedPresentationMode" Value="0" /> 
       </MultiTrigger.Conditions> 
       <MultiTrigger.Setters> 
        <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" /> 
       </MultiTrigger.Setters> 
      </MultiTrigger> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="False" /> 
        <Condition Property="gui:MyUserControl.DeselectedPresentationMode" Value="1" /> 
       </MultiTrigger.Conditions> 
       <MultiTrigger.Setters> 
        <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeSimple}" /> 
       </MultiTrigger.Setters> 
      </MultiTrigger> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="True" /> 
        <Condition Property="gui:MyUserControl.SelectedPresentationMode" Value="0" /> 
       </MultiTrigger.Conditions> 
       <MultiTrigger.Setters> 
        <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeExtended}" /> 
       </MultiTrigger.Setters> 
      </MultiTrigger> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="True" /> 
        <Condition Property="gui:MyUserControl.SelectedPresentationMode" Value="1" /> 
       </MultiTrigger.Conditions> 
       <MultiTrigger.Setters> 
        <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" /> 
       </MultiTrigger.Setters> 
      </MultiTrigger> 
     </Style.Triggers> 
    </Style> 
    ... 
    ... 
    <ListBox ... ItemContainerStyle="{StaticResource MyUserControlItemStyle}"/> 

Но если я использую MyUserControl еще один проект, нет реакции, если я изменю свой DependencyProperty. использовать ли я xaml например:

<Window 
... 
x:Class="WpfControlsTester.MainWindow" 
Title="MainWindow"> 
<Grid> 
    <GUI:MyUserControl Name="test"/> 
    <Slider Minimum="0" Maximum="1" Value="{Binding SelectedPresentationMode, ElementName=test}" /> 
    <Slider Minimum="0" Maximum="1" Value="{Binding DeselectedPresentationMode, ElementName=test}" /> 
</Grid> 

или если я использую любой вид манипулирования значение как this.test.DeselectedPresentationMode = 0; на событие или еще чего-л.

Я использовал WPF Inspector для «отладки» моих триггеров, и оба свойства всегда имели значение по умолчанию (1). Где моя ошибка или что я должен добавить для обновления моих триггеров?

Edit: Изменено ложь «MyControl в„MyUserControl“

ответ

1

Вы можете попробовать MultiDatatrigger вместо так, чтобы получить изменения свойств:

<Style.Triggers> 
       <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False" /> 
         <Condition Binding="{Binding DeselectedPresentationMode, RelativeSource={RelativeSource AncestorType={x:Type MyUserControl}}}" Value="0" /> 
         </MultiDataTrigger.Conditions> 
          <MultiDataTrigger.Setters> 
         <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" /> 
         </MultiDataTrigger.Setters> 
       </MultiDataTrigger> 
      </Style.Triggers> 

Благодаря

+0

Спасибо большое, это сработало для меня. Я также пробовал MultiDataTrigger, но я получаю исключение, например «Свойство» - привязка не должна быть нулевой. Возможно, я реализовал это неправильно :-) – Kooki

1

Это может быть просто ошибка копирования и вставки, но в вашем примере кода, в котором вы объявляете Dependency Properties, элемент управления с именем MyUserControl, но в другие примеры кода, это называется MyControl. Эти имена должны соответствовать, если вы хотите, чтобы это работало.

UPDATE >>>

Хорошо, я подумал, что может быть так ... так, двигаясь по ... вы можете увидеть значение свойства, если вы просто привязываетесь к нему?

<TextBlock Text="{Binding SelectedPresentationMode, ElementName=test}" /> 

Если вы можете, то мы можем двигаться дальше ... обычно, когда привязка не работает, есть строка, которая начинается с выхода слова Error в Output Window в Visual Studio. Что говорит ваша ошибка. если у тебя есть? (Вы может нужно включить эту функцию на перейдя в меню Инструменты> Параметры> Debugging> Окно> WPF Настройки трассировки и настройки Data Binding опцию Warning или Error.)

Если у вас нет ошибки в окне вывода , это может оказаться более сложным для отладки. Дай мне знать.

+0

Sry, как и ожидалось, что это только с & р ошибки, поэтому на производительный код этого не может быть моим ошибка. – Kooki