Tôi đang cố gắng để thiết lập IsExpanded
tài sản của TreeView
mục của tôi bằng cách sử dụng mẫu có điều kiện, trong XAML
:Thiết IsExpanded trên WPF TreeViewItem từ một DataTrigger
<DataTrigger Binding="{Binding MyStatus}" Value="Opened">
<Setter TargetName="MyTextBlock" Property="Foreground" Value="Green"/>
<Setter Property="TreeViewItem.IsExpanded" Value="True" />
</DataTrigger>
Khi tôi đặt MyStatus
tài sản từ C# mã, màu sắc được thay đổi (vì vậy DataTrigger hoạt động), nhưng các nút không được mở rộng.
_myItems[0].MyStatus = MyStatus.Opened;
Làm thế nào tôi có thể thiết lập TreeViewItem.IsExpanded
tài sản từ một DataTrigger
?
Khi tôi khởi động ứng dụng, màu sắc được thiết lập một cách chính xác, nhưng các nút màu xanh lá cây không được mở rộng:
Và sau khi thay đổi giá trị của _myItems[0].MyStatus
và _myItems[1].MyStatus
, màu sắc được thay đổi cho phù hợp , nhưng nút màu xanh lá cây vẫn chưa được mở rộng.
Full Mã (XAML)
Mã đầy đủ là một chút dài, nhưng đó là 90% soạn sẵn.
<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>
Full Mã (C#)
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));
}
}
}
}
Liên quan: [WPF DataBound treeview mở rộng/thu gọn] (http://stackoverflow.com/q/1717654/324969), nhưng chúng sử dụng 'Style' trong khi tôi sử dụng' DataTrigger'. –