0
我有一個樣式TreeListViewItem
...真的只是一個ListViewItem
「樹結構」。 ListViewItem
的DataContext
設置爲我的視圖模型,該模型的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");
}
}
}
我會做到這一點,但除非我缺少明顯的東西,我不能做到這一點... IsKeyboardFocusWithin上的UIElement – Thelonias
確認一個只讀屬性!我沒有意識到這一點。我查閱了將只讀屬性綁定到讀寫屬性,並且只在下面的SO問題中可行。目前還不清楚哪一個決議實際上運作的OP方式想... ... http://stackoverflow.com/questions/658170/onewaytosource-binding-from-readonly-property-in-xaml – CodeWarrior
進一步檢查後,我不認爲IsKeyboardFocusWithin將是我最好的選擇。我的TreeListViewItems可以有項目,我遇到了一個問題,如果我將焦點放在子TreeListViewItem的文本框中,我的父項get被選中。我在你提供的鏈接中使用了「解決方案」的變體,但它仍然不是我要找的。我認爲它最適合平面列表。 – Thelonias