2012-01-01 4 views
2

DataTrigger существует в ControlTemplateDataTrigger не стрельбы при связывании свойства зависимостей изменения

<DataTrigger 
    Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, 
       Path=(ui:TreeViewItemHeader.IsDragTarget)}" 
    Value="True"> 
    <Setter TargetName="PART_Content" Property="Foreground" Value="Red" /> 
</DataTrigger> 

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

public static readonly DependencyProperty IsDragTargetProperty = DependencyProperty.RegisterAttached 
     ("IsDragTarget", 
     typeof(bool), 
     typeof(TreeViewItemHeader), 
     new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); 

public static void SetIsDragTarget(DependencyObject self, bool value) 
{ 
    self.SetValue(IsDragTargetProperty, value); 
} 

public static bool GetIsDragTarget(DependencyObject self) 
{ 
    return (bool)self.GetValue(IsDragTargetProperty); 
} 

Проблема может быть описана, что только DataTrigger разрешает значение один раз, когда элемент управления инициализируется. Обновление значения свойства не переворачивает DataTrigger.

неисправностей выполняется:

  • Заготовка IValueConverter "возвращаемое значение" был добавлен к связыванию; метод IValueConverter.Convert вызывается только один раз.
  • Отладка была выполнена для проверки того, что значение прикрепленного свойства изменено.
  • Недвижимость DataTrigger.Value была установлена ​​в False - начальная стоимость прилагаемого имущества; Setters запускаются один раз, когда элемент управления инициализируется. Последующие изменения свойства не сработали DataTrigger.
  • Окно выхода Visual Studio не показывает никаких предупреждений о выражении привязки.
+0

Определяет ли параметр 'PART_Content' цвет переднего плана в определении' '? Если это так, это значение перезапишет любые вызванные значения – Rachel

+0

@ Rachel- Нет, это не так, но спасибо. –

ответ

3

ли это строгое требование использовать DataTrigger? Я получил это работает, переключившись на Trigger:

<Trigger Property="ui:TreeViewItemHeader.IsDragTarget" Value="True"> 
    <Setter TargetName="PART_Content" Property="Foreground" Value="Red" /> 
</Trigger> 

Не знаю, почему DataTrigger не работает, хотя.

+0

Из документации. Представляет триггер, который применяет значения свойств или выполняет действия, когда связанные данные соответствуют заданному условию. Я думаю, что свойство не связано данными. – Paparazzi

+0

Я не совсем уверен, почему я использовал DataTrigger. Я думаю, что я обманул себя, полагая, что это было необходимо из-за того, что я писал триггер внутри ControlTemplate и не мог использовать свойство Trigger.SourceName для ссылки на root UserControl. Ваш пост дал мне прозрение, что мне вообще не нужно SourceName. Оно работает. Благодарю. –

0

вам нужно поднять значение свойства изменения событий путем реализации интерфейса с INotifyPropertyChanged

Как показано в here

+0

Привет суровый. Свойство на самом деле является зависимым свойством зависимостей, поэтому я не считаю, что требуется INotifyPropertyChanged. –

+0

WPF основан главным образом на системе свойств, и в качестве изменения стоимости нам нужно вызвать уведомление об изменении свойства, которое обрабатывает wpf. –

+0

Вы пробовали один раз? –

0

Не следует ли добытчик & сеттер определить что-то вроде:

public static readonly DependencyProperty IsDragTargetProperty = DependencyProperty.RegisterAttached 
     ("IsDragTarget", 
     typeof(bool), 
     typeof(TreeViewItemHeader), 
     new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); 

public bool IsDragTarget { 
      get { return (bool)this.GetValue(IsDragTargetProperty); } 
      set { this.SetValue(IsDragTargetProperty, value); } 
     } 
+0

Loxxy- Ты бы написал, если бы мы говорили о свойстве зависимостей.Мы на самом деле говорим о прикрепленном имуществе. –

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