【问题标题】:ListViewItem IsKeyboardFocusWithin not triggering IsSelectedChange on view modelListViewItem IsKeyboardFocusWithin 未在视图模型上触发 IsSelectedChange
【发布时间】:2011-09-23 13:53:57
【问题描述】:

我有一个TreeListViewItem 的样式...实际上只是一个“树结构”中的ListViewItemListViewItemDataContext 设置为我的视图模型,该模型具有绑定到项目的 IsSelectedIsSelected 属性。我进行了更改,以便在选择项目时以不同的方式设置项目的样式,并且我的视图模型上的属性设置为“真”。这很好用,但是当我为IsKeyboardFocusWithin 添加触发器时,不再设置 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>

ViewModel 代码:

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

【问题讨论】:

    标签: wpf xaml binding styles


    【解决方案1】:

    为什么不在 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");
          }
        }
    }
    

    【讨论】:

    • 我会这样做,但除非我遗漏了一些明显的东西,否则我不能这样做...IsKeyboardFocusWithin 是 UIElement 上的只读属性
    • 确认!我没有意识到这一点。我查找了将只读属性绑定到读写属性,并且只提出了以下可行的 SO 问题。目前尚不清楚哪种分辨率实际上以 OP 想要的方式工作...stackoverflow.com/questions/658170/…
    • 经过进一步检查,我认为 IsKeyboardFocusWithin 不会是我最好的选择。我的 TreeListViewItems 可以有项目,我遇到了一个问题,如果我将焦点放在子 TreeListViewItem 中的文本框上,我的父项目就会被选中。我在您提供的链接中使用了“解决方案”的变体,但它仍然不是我想要的。我认为它最适合平面列表。
    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2021-01-17
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多