2013-04-19 2 views
1

В настоящее время я использую код из блога blogstost this, чтобы мой TreeView выделил те элементы, которые в настоящее время зависают от мыши. Это работает так, как планировалось, однако теперь я хочу, чтобы TreeViewItems уведомляли свои прикрепленные ViewModels, когда они зависали/не зависали.TreeViewItem, чтобы уведомить ViewModel, когда он зависает

Однако я не понимаю, как я могу это достичь. Соответствующий код XAML выглядит следующим образом:

<Style TargetType="{x:Type TreeViewItem}"> 
    <Style.Triggers> 
     <Trigger Property="Controls:TreeViewHelper.IsMouseDirectlyOverItem" Value="True"> 
      <Setter Property="Background" Value="Green" /> 
     </Trigger> 
    </Stile.Triggers> 
</Style> 

Как я могу связать свойство моего ViewModel, названный TreeNodeModel.IsHovered к TreeViewItem (или, возможно, свойство придает зависимость IsMouseDirectlyOverItem), так что я могу реагировать на эти изменения из моего кода?

Все примеры, которые я нашел через Google, объясняют только как установить цвет фона. Заранее благодарю за ваше время на вероятном тривиальном ответе.

ответ

1

В вашем Style, попробуйте добавить Setter, который связывает IsMouseDirectlyOverItem с IsHovered и использовать связывающий режим OneWayToSource нажать Значение правильного путь:

<Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="Controls:TreeViewHelper.IsMouseDirectlyOverItem" 
      Value="{Binding Path=IsHovered, Mode=OneWayToSource}" /> 

    <Style.Triggers> 
     ... 
</Style> 

EDIT: Как IsMouseDirectlyOver только для чтения, и только для чтения DP не могут быть объектом каких-либо привязок, может оказаться возможным PushBinding Fredrik Hedblad: OneWayToSource Binding for ReadOnly Dependency Property

<Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="pb:PushBindingManager.StylePushBindings"> 
     <Setter.Value> 
      <pb:PushBindingCollection> 
       <pb:PushBinding TargetDependencyProperty="Controls:TreeViewHelper.IsMouseDirectlyOverItem" 
           Path="IsHovered" /> 
      </pb:PushBindingCollection> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     ... 
</Style> 
+0

Я пробовал это, но получаю исключение при запуске программы «Дополнительная информация: объект« Setter »не может указывать значение для свойства« Только для чтения »IsMouseDirectlyOverItem». Исключение имеет смысл, поскольку свойство действительно доступно только для чтения. Изменение его для чтения/записи для меня не кажется логичным. Есть ли другой способ уведомить мою модель просмотра? – Simon

+1

Hm .. Если вы не хотите изменять 'IsMouseDirectlyOver' для чтения/записи, этот ответ на связанный вопрос SO может иметь обходное решение для вас: [привязка OneWayToSource от свойства readonly в Xaml] (http: // stackoverflow. com/questions/658170/onewaytosource-binding-from-readonly-property-in-xaml # answer-7227295) – Sphinxxx

+1

..и также прочитайте раздел «Обновление: использование PushBinding в стиле» в сопроводительном сообщении в блоге Hedblad: [Связывание OneWayToSource для свойства ReadOnly Dependency] (http://meleak.wordpress.com/2011/08/28/onewaytosource-binding-for-readonly-dependency-property/). – Sphinxxx

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