- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用条件模板在 XAML
中设置我的 TreeView
项目的 IsExpanded
属性:
<DataTrigger Binding="{Binding MyStatus}" Value="Opened">
<Setter TargetName="MyTextBlock" Property="Foreground" Value="Green"/>
<Setter Property="TreeViewItem.IsExpanded" Value="True" />
</DataTrigger>
当我从 C# 代码设置 MyStatus
属性时,颜色发生了变化(因此 DataTrigger 起作用),但节点没有展开。
_myItems[0].MyStatus = MyStatus.Opened;
如何从 DataTrigger
设置 TreeViewItem.IsExpanded
属性?
当我启动应用程序时,颜色设置正确,但绿色节点未展开:
并且在改变_myItems[0].MyStatus
和_myItems[1].MyStatus
的值后,颜色也随之改变,但绿色节点仍然没有展开。
完整代码有点长,但 90% 是样板。
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="150" Width="250">
<DockPanel>
<DockPanel.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding SubItems}" x:Key="MyTemplate">
<StackPanel Orientation="Horizontal">
<!-- ... -->
<TextBlock x:Name="MyTextBlock" Foreground="Green" Text="{Binding Name}" />
</StackPanel>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding MyStatus}" Value="Closed">
<Setter TargetName="MyTextBlock" Property="Foreground" Value="Red"/>
<Setter Property="TreeViewItem.IsExpanded" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding MyStatus}" Value="Opened">
<Setter TargetName="MyTextBlock" Property="Foreground" Value="Green"/>
<Setter Property="TreeViewItem.IsExpanded" Value="True" />
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
</DockPanel.Resources>
<Button Name="button1" Click="button1_Click" DockPanel.Dock="Top" Content="Button1"/>
<TreeView Name="treeView1" ItemsSource="{Binding MyItems}" ItemTemplate="{StaticResource MyTemplate}"/>
</DockPanel>
</Window>
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
namespace WpfApplication6
{
public partial class MainWindow : Window
{
private ObservableCollection<MyItemCollection> _myItems;
public MainWindow() {
InitializeComponent();
_myItems = new ObservableCollection<MyItemCollection> {
new MyItemCollection { Name = "Parent1", MyStatus = MyStatus.Closed, SubItems = { new MyItemCollection { Name = "Child1" } } },
new MyItemCollection { Name = "Parent2", MyStatus = MyStatus.Opened, SubItems = { new MyItemCollection { Name = "Child2" } } }
};
DataContext = new {
MyItems = _myItems
};
}
private void button1_Click(object sender, RoutedEventArgs e) {
_myItems[0].MyStatus = MyStatus.Opened;
_myItems[1].MyStatus = MyStatus.Closed;
}
}
public enum MyStatus
{
Closed,
Opened
}
public class MyItemCollection : INotifyPropertyChanged
{
public MyItemCollection() {
SubItems = new ObservableCollection<MyItemCollection>();
_myStatus = MyStatus.Closed;
}
public string Name { get; set; }
public ObservableCollection<MyItemCollection> SubItems { get; set; }
private MyStatus _myStatus;
public MyStatus MyStatus {
get { return _myStatus; }
set { _myStatus = value; NotifyPropertyChanged("MyStatus"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
最佳答案
这里有一些错误。第一个是您在 HierarchicalDataTemplate
上设置属性 TreeViewItem.IsSelected
。这行不通。相反,您需要在 TreeView
上设置一个 ItemContainerStyle
:
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<!-- put logic for handling expansion here -->
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
但是,您不能只将 Trigger
放在这里。因为DependencyProperty
value precedence ,如果您的用户单击节点以展开或折叠它们,您的触发器将不会在优先级列表中排名第一(即本地值)。因此,最好的办法是创建一个新的 IValueConverter
以将 MyStatus
转换为 bool
。然后在 Style
的 Setter
中设置一个 TwoWay
绑定(bind):
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded"
Value="{Binding MyStatus, Converter={StaticResource statusToBool}}" />
</Style>
还有你的转换器:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((MyStatus)value) == MyStatus.Opened;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value) ? MyStatus.Opened : MyStatus.Closed;
}
关于c# - 通过 DataTrigger 在 WPF TreeViewItem 上设置 IsExpanded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403929/
在下面的代码中: http://msdn.microsoft.com/en-us/library/ms754027.aspx 如何将 IsExpanded 绑定(bind)到对象的 MyData 列表
我有一个 Expander 控件,其 IsExpanded 属性绑定(bind)到 mvvm 模型中的 bool。在您不触摸扩展器之前,绑定(bind)工作正常。单击扩展器中的箭头进行扩展后,绑定(b
我有一个相当棘手的问题: 我正在使用 ListView 控件,其中 ItemsSource 设置为 CollectionViewSource,包括 PropertyGroupDescription 以
我有一个分层数据类,比如 public class MyNode { public string Name { get; set;} public bool IsExpanded { ge
我觉得我在 WPF 数据绑定(bind)中缺少一些基本概念。我的绑定(bind)是否对我有用总是成问题的。 在此示例中,我想将 TreeViewItem 的 IsExpanded 属性双向绑定(bin
我有 TreeView控制和我想绑定(bind)树节点的IsExpanded属性(property)归我DataSource项目! 但我有一个异常(exception): System.Windows
我正在使用JXTreeTable。我想仅在行折叠时才在单元格中显示文本。如果该行展开,则详细值将显示在子级中,因此父级中的缩短文本不应再可见。 据我所知,这需要通过提供 DefaultTableRen
要获得一些上下文,这个问题指的是 How to save the IsExpanded state in group headers of a listview 我在这里错过了什么? 当我尝试执行引用
我对 GroupStyle 和 Expander.IsExpanded 绑定(bind)有疑问。我的代码基于这个答案:How to save the IsExpanded state in group
我有一个 TreeView,它将在任意层次结构中显示几种不同的数据类型。为此,我为将在我的 TreeView 中显示的每个数据类型定义了特定的 HierarchicalDataTemplate:
我正在尝试使用条件模板在 XAML 中设置我的 TreeView 项目的 IsExpanded 属性: 当我从 C# 代码设置 MyStatus 属性时,颜色发生了变化(因此
考虑 ViewModel暴露在 Model 中定义的树,然后将其数据绑定(bind)到 TreeView .树相当大,直接使用模型,因为它对于 View 本质上是只读的。现在,TreeView生活在
我是一名优秀的程序员,十分优秀!