Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何将树视图项绑定到IsSelectionActive属性_Wpf - Fatal编程技术网

Wpf 如何将树视图项绑定到IsSelectionActive属性

Wpf 如何将树视图项绑定到IsSelectionActive属性,wpf,Wpf,我有一个WPF应用程序,其中视图模型位于.Net标准库中,因此它们可以在移动应用程序中重用。这意味着视图模型无法访问实际控件。我有一个树状视图,它使用DataTemplate定义树状视图项。然后我有一个ContentControl,它显示一个矢量图像。矢量图像的填充是绑定到视图模型的数据。问题是,当树视图项不再聚焦但仍处于选中状态时,我需要更改颜色。我的视图模型数据如何绑定到树视图项聚焦属性?经过更多的研究,我似乎需要以一种方式将控件绑定到我的viewmodel,以使其成为IsSelection

我有一个WPF应用程序,其中视图模型位于.Net标准库中,因此它们可以在移动应用程序中重用。这意味着视图模型无法访问实际控件。我有一个树状视图,它使用
DataTemplate
定义树状视图项。然后我有一个
ContentControl
,它显示一个矢量图像。矢量图像的填充是绑定到视图模型的数据。问题是,当树视图项不再聚焦但仍处于选中状态时,我需要更改颜色。我的视图模型数据如何绑定到树视图项聚焦属性?经过更多的研究,我似乎需要以一种方式将控件绑定到我的viewmodel,以使其成为IsSelectionActive,但是TreeViewItem样式不允许绑定到IsSelectionActive,因为没有setter

<DataTemplate x:Key="NormalTemplate">
   <StackPanel 
      Orientation="Horizontal" 
      ToolTip="{Binding Tooltip}"
      Opacity="{Binding Opacity}">

      <ContentControl Template="{StaticResource TreeViewItemImage}" Focusable="False"/>

      <fa:ImageAwesome  
         Style="{StaticResource TreeNodeIsWaitingForResult}"
         Visibility="{Binding IsRunning, Converter={StaticResource BooleanToVisibilityConverter}, FallbackValue=Hidden}"/>

      <TextBlock Text="{Binding Text}" Style="{StaticResource TreeViewItemTextBlockStyle}" />

      <StackPanel.ContextMenu>
         <ContextMenu                                 
            ItemContainerStyle="{StaticResource ContextMenuItemStyle}" 
            ItemsSource="{Binding MenuItemVMs}" 
            Visibility="{Binding MenuItemVisibility, Converter={StaticResource BooleanToVisibilityConverter}, FallbackValue=Hidden}"/>
      </StackPanel.ContextMenu>
   </StackPanel>
</DataTemplate>

我对每个注释进行了以下更改,但在尝试加载矢量图像资源样式时收到以下错误:

System.Windows.Markup.XamlParseException:“无法在“触发器”类型的“属性”属性上设置“绑定”。“绑定”只能在DependencyObject的DependencyProperty上设置。”

以下是我的最新风格:

    <Style x:Key="HostsTreeNodeStyle" TargetType="{x:Type ContentControl}" BasedOn="{StaticResource TreeNodeStyle}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <Viewbox Style="{StaticResource TreeNodeViewboxStyle}">
                    <Canvas Width="24" Height="24">
                        <Path Data="M4,1H20A1,1 0 0,1 21,2V6A1,1 0 0,1 20,7H4A1,1 0 0,1 3,6V2A1,1 0 0,1 4,1M4,9H20A1,1 0 0,1 21,10V14A1,1 0 0,1 20,15H4A1,1 0 0,1 3,14V10A1,1 0 0,1 4,9M4,17H20A1,1 0 0,1 21,18V22A1,1 0 0,1 20,23H4A1,1 0 0,1 3,22V18A1,1 0 0,1 4,17M9,5H10V3H9V5M9,13H10V11H9V13M9,21H10V19H9V21M5,3V5H7V3H5M5,11V13H7V11H5M5,19V21H7V19H5Z" />
                    </Canvas>
                </Viewbox>
                <ControlTemplate.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="True"/>
                            <Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="False"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{Binding Color1}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="True"/>
                            <Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="True"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{Binding Color2}"/>
                    </MultiDataTrigger>
                    <Trigger Property="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="false">
                        <Setter Property="Foreground" Value="{Binding Color3}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以使用和为这些条件创建一个
多数据触发器

下面是一个示例,使用此方法更改
文本块
文本
,如果它位于选中的
树视图项
内,但不在焦点中:

public partial class MainWindow : Window
{
    public List<FooItem> Items { get; } = new List<FooItem> { new FooItem() { Name = "A" },
                                                              new FooItem() { Name = "B" },
                                                              new FooItem() { Name = "C" },
                                                              new FooItem() { Name = "D" }};
}

public class FooItem
{
    public string Name { get; set; }

    public string SelectedButNotFocusedName => Name + "*";
}
公共部分类主窗口:窗口
{
公共列表项{get;}=new List{new FooItem(){Name=“A”},
new FooItem(){Name=“B”},
new FooItem(){Name=“C”},
新建FooItem(){Name=“D”};
}
公共类食物项目
{
公共字符串名称{get;set;}
公共字符串SelectedButNotFocusedName=>Name+“*”;
}

最后的
文本框
仅作为另一个元素存在,您可以将焦点放在其中,以查看代码是否正常工作


您可以将备选颜色显示为视图模型的属性,然后在UI中使用上述设置在它们之间切换。

我已根据您的评论对问题进行了更改。我现在收到以下错误:System.Windows.Markup.XamlParseException:“无法在类型为“Trigger”的“Property”属性上设置“Binding”。“绑定”只能在DependencyObject的DependencyProperty上设置。“我在这里的目标是实际绑定到IsKeyboardFocusIn,以便我可以处理视图模型中的颜色,而不是布局样式。
<Window x:Class="CSharpTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <DockPanel>
        <TreeView ItemsSource="{Binding Items}" DockPanel.Dock="Left">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Setter Property="Text" Value="{Binding Name}"/>

                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="True"/>
                                            <Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="False"/>
                                        </MultiDataTrigger.Conditions>

                                        <Setter Property="Text" Value="{Binding SelectedButNotFocusedName}"/>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

        <TextBox/>
    </DockPanel>
</Window>