2011-06-27 10 views
0

我有一個樣式TreeListViewItem ...真的只是一個ListViewItem「樹結構」。 ListViewItemDataContext設置爲我的視圖模型,該模型的IsSelected屬性綁定到該項目的IsSelected。我做了一個更改,以便在選擇該項目時,對項目進行不同的樣式設置,並將viewmodel上的屬性設置爲「true」。這很好,但是當我添加了一個觸發器IsKeyboardFocusWithin時,viewmodel屬性不再被設置。該項目的風格仍然改變,但我需要視圖模型上的屬性也改變。任何幫助都會很棒。ListViewItem IsKeyboardFocusWithin不觸發視圖模型上的IsSelectedChange

XAML:

<Style TargetType="{x:Type zcorectl:ZynTreeListViewItem}"> 
    <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/> 
    <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}"/> 
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type zcorectl:ZynTreeListViewItem}"> 
       <StackPanel> 
        <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
         <GridViewRowPresenter x:Name="PART_Header" Content="{TemplateBinding Header}" Columns="{StaticResource columns}" /> 
        </Border> 
        <ItemsPresenter x:Name="ItemsHost"/> 
       </StackPanel> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsExpanded" Value="false"> 
         <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="HasHeader" Value="false"/> 
          <Condition Property="Width" Value="Auto"/> 
         </MultiTrigger.Conditions> 
         <Setter TargetName="PART_Header" Property="MinWidth" Value="75"/> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="HasHeader" Value="false"/> 
          <Condition Property="Height" Value="Auto"/> 
         </MultiTrigger.Conditions> 
         <Setter TargetName="PART_Header" Property="MinHeight" Value="19"/> 
        </MultiTrigger> 
        <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
          <Setter Property="IsSelected" Value="True"/> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter TargetName="Bd" Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
         <Setter TargetName="Bd" Property="BorderThickness" Value="0,2"/>               
         <Setter TargetName="Bd" Property="Height" Value="45"/>               
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
         </Trigger> 
         <MultiTrigger>               
          <MultiTrigger.Conditions> 
           <Condition Property="IsSelected" Value="true"/> 
           <Condition Property="IsSelectionActive" Value="false"/>                 
          </MultiTrigger.Conditions>               
          <Setter TargetName="Bd" Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
          <Setter TargetName="Bd" Property="BorderThickness" Value="0,2"/>               
          <Setter TargetName="Bd" Property="Height" Value="45"/>               
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>               
         </MultiTrigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

視圖模型代碼:

private bool _isSelected = false; 
public bool IsSelected 
{ 
    get { return _isSelected; } 
    set 
    { 
     if (_isSelected != value) 
     { 
      _isSelected = value; 
      OnPropertyChanged("IsSelected"); 
     } 
    } 
} 

回答

0

爲什麼不創建視圖模型一個KeyboardFocus財產,並把邏輯呢?

private bool _isKeyboardFocusSet = false; 
public bool IsKeyboardFocusSet 
{ 
    get { return _isKeyboardFocusSet; } 
    set 
    { 
     if (_isKeyboardFocusSet!= value) 
     { 
     _isKeyboardFocusSet = value; 
     OnPropertyChanged("isKeyboardFocusSet"); 
     } 
     if (_isSelected != true) 
     { 
     _isSelected = _isKeyboardFocusSet; 
     OnPropertyChanged("IsSelected"); 
     } 
    } 
} 
+0

我會做到這一點,但除非我缺少明顯的東西,我不能做到這一點... IsKeyboardFocusWithin上的UIElement – Thelonias

+1

確認一個只讀屬性!我沒有意識到這一點。我查閱了將只讀屬性綁定到讀寫屬性,並且只在下面的SO問題中可行。目前還不清楚哪一個決議實際上運作的OP方式想... ... http://stackoverflow.com/questions/658170/onewaytosource-binding-from-readonly-property-in-xaml – CodeWarrior

+0

進一步檢查後,我不認爲IsKeyboardFocusWithin將是我最好的選擇。我的TreeListViewItems可以有項目,我遇到了一個問題,如果我將焦點放在子TreeListViewItem的文本框中,我的父項get被選中。我在你提供的鏈接中使用了「解決方案」的變體,但它仍然不是我要找的。我認爲它最適合平面列表。 – Thelonias

相關問題