मैं एक सशर्त टेम्पलेट का उपयोग कर मेरी TreeView
मदों की IsExpanded
गुण सेट करने के लिए कोशिश कर रहा हूँ से एक WPF TreeViewItem पर IsExpanded स्थापना, XAML
में:एक DataTrigger
<DataTrigger Binding="{Binding MyStatus}" Value="Opened">
<Setter TargetName="MyTextBlock" Property="Foreground" Value="Green"/>
<Setter Property="TreeViewItem.IsExpanded" Value="True" />
</DataTrigger>
जब मैं से सी # MyStatus
गुण सेट कोड, रंग बदल दिए गए हैं (इसलिए डेटा ट्रिगर काम करता है), लेकिन नोड्स का विस्तार नहीं किया जाता है।
_myItems[0].MyStatus = MyStatus.Opened;
कैसे मैं एक DataTrigger
से TreeViewItem.IsExpanded
गुण सेट कर सकते हैं?
जब मैं आवेदन शुरू, रंग सही ढंग से स्थापित कर रहे हैं, लेकिन हरी नोड का विस्तार नहीं किया गया है:
और _myItems[0].MyStatus
और _myItems[1].MyStatus
का मूल्य बदलने के बाद, रंग के हिसाब से बदल रहे हैं , लेकिन हरा नोड अभी भी विस्तारित नहीं है।
पूर्ण कोड (XAML)
पूर्ण कोड थोड़ा लंबा है, लेकिन यह 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));
}
}
}
}
संबंधित: [डब्ल्यूपीएफ डेटाबाउंड ट्रीव्यू व्यू/पतन] (http://stackoverflow.com/q/1717654/324969), लेकिन जब मैं 'DataTrigger' का उपयोग करता हूं तो वे 'स्टाइल' का उपयोग करते हैं। –