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