2015-02-20 1 views
0

У меня есть следующий пользовательский элемент управления:Использование свойства зависимостей в Trigger данных

public class AnimatedButton : Button 
    { 
     public enum ButtonStates 
     { 
      None, 
      Busy 
     } 

     public ButtonStates State 
     { 
      get { return (ButtonStates)GetValue(StateProperty); } 
      set { SetValue(StateProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for State. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty StateProperty = 
      DependencyProperty.Register("State", typeof(ButtonStates), typeof(AnimatedButton), new PropertyMetadata(ButtonStates.None)); 

     public ImageSource ImageDefault 
     { 
      get { return (ImageSource)GetValue(ImageDefaultProperty); } 
      set { SetValue(ImageDefaultProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for ImageDefault. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty ImageDefaultProperty = 
      DependencyProperty.Register("ImageDefault", typeof(ImageSource), typeof(AnimatedButton), new PropertyMetadata(null)); 

     public ImageSource ImageBusy 
     { 
      get { return (ImageSource)GetValue(ImageBusyProperty); } 
      set { SetValue(ImageBusyProperty, value); } 
     } 

     ... 
    } 

Моя цель здесь заключается в отображении соответствующего источника изображения на основе текущего состояния кнопки. Например, если ButtonState Нет, тогда отобразите изображение по умолчанию, в противном случае отобразите изображение Занят, довольно просто. Вот стиль:

<Style TargetType="{x:Type controls:AnimatedButton}"> 
    ... 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:AnimatedButton}"> 
       <Border> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 

         <Image x:Name="img"/> 

         <TextBlock Text="{TemplateBinding Content}" 
            Grid.Column="1"/> 
        </Grid> 
       </Border> 

       <ControlTemplate.Triggers> 
        <DataTrigger Binding="{Binding State}" Value="None"> 
         <Setter TargetName="img" Property="Source" Value="{Binding ImageDefault}"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding State}" Value="Busy"> 
         <Setter TargetName="img" Property="Source" Value="{Binding ImageBusy}"/> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Проблема заключается в DataTrigger, не подбирая свойство зависимостей State. После добавления элемента управления на вид, я получаю следующее сообщение об ошибке в выходе:

System.Windows.Data Error: 40 : BindingExpression path error: 'State' property not found on 'object' ''WorkspaceViewModel' (HashCode=56037929)'. BindingExpression:Path=State; DataItem='WorkspaceViewModel' (HashCode=56037929); target element is 'AnimatedButton' (Name=''); target property is 'NoTarget' (type 'Object') 

Чтение, что сообщение об ошибке, это выглядит как будто он ищет государственного собственности на WorkspaceViewModel в отличие от которому принадлежит свойство зависимостей. Почему это?

ответ

1

Привязки в DataTriggers (правильно) ожидают, что свойство State будет находиться в DataContext элемента управления. Но вы хотите вызвать значение свойства самого элемента управления.

Вы должны поэтому использовать триггеры вместо DataTriggers:

<ControlTemplate.Triggers> 
    <Trigger Property="State" Value="None"> 
     <Setter TargetName="img" Property="Source" 
      Value="{Binding ImageDefault, RelativeSource={RelativeSource TemplatedParent}}"/> 
    </Trigger> 
    <Trigger Property="State" Value="Busy"> 
     <Setter TargetName="img" Property="Source" 
      Value="{Binding ImageBusy, RelativeSource={RelativeSource TemplatedParent}}"/> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

Отлично, спасибо :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^