Wpf ListViewItem IsKeyboardFocusIn未触发IsSelectedChange视图模型
我有一个Wpf ListViewItem IsKeyboardFocusIn未触发IsSelectedChange视图模型,wpf,xaml,binding,styles,Wpf,Xaml,Binding,Styles,我有一个TreeListViewItem的样式……实际上只是一个“树结构”中的ListViewItem。ListViewItem的DataContext被设置为my view模型,该模型的IsSelected属性绑定到项目的IsSelected。我做了一个更改,以便在选择项目时,以不同的方式设置项目的样式,并且我的viewmodel上的属性设置为“true”。这很好,但是当我为IsKeyboardFocusWithin添加一个触发器时,viewmodel属性不再设置。项目的样式仍在更改,但我需要
TreeListViewItem
的样式……实际上只是一个“树结构”中的ListViewItem
。ListViewItem
的DataContext
被设置为my view模型,该模型的IsSelected
属性绑定到项目的IsSelected
。我做了一个更改,以便在选择项目时,以不同的方式设置项目的样式,并且我的viewmodel上的属性设置为“true”。这很好,但是当我为IsKeyboardFocusWithin
添加一个触发器时,viewmodel属性不再设置。项目的样式仍在更改,但我需要同时更改viewmodel的属性。任何帮助都会很好
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");
}
}
}
为什么不在ViewModel中创建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");
}
}
}
我会这样做,但除非我遗漏了一些明显的东西,否则我不能这样做…IsKeyboardFocusInwithin是UIElementAck上的只读属性!我没有意识到这一点。我查找了将只读属性绑定到读写属性的情况,并仅提出了以下可行的问题。目前尚不清楚哪一种解决方案真正符合OP的要求。。。经过进一步检查,我不认为IsKeyboardFocusWithin是我最好的选择。我的TreeListViewItems可以有项目,我遇到了一个问题,如果我将焦点放在子TreeListViewItem中的文本框上,我的父项目就会被选中。我在您提供的链接中使用了“解决方案”的变体,但它仍然不是我要寻找的。我认为它最适合平面列表。