2013-08-23 9 views
7

मैं एक सशर्त टेम्पलेट का उपयोग कर मेरी 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 गुण सेट कर सकते हैं?

जब मैं आवेदन शुरू, रंग सही ढंग से स्थापित कर रहे हैं, लेकिन हरी नोड का विस्तार नहीं किया गया है:

Screenshot just after starting the application

और _myItems[0].MyStatus और _myItems[1].MyStatus का मूल्य बदलने के बाद, रंग के हिसाब से बदल रहे हैं , लेकिन हरा नोड अभी भी विस्तारित नहीं है।

Screenshot after clicking the Button1

पूर्ण कोड (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)); 
      } 
     } 
    } 
} 
+0

संबंधित: [डब्ल्यूपीएफ डेटाबाउंड ट्रीव्यू व्यू/पतन] (http://stackoverflow.com/q/1717654/324969), लेकिन जब मैं 'DataTrigger' का उपयोग करता हूं तो वे 'स्टाइल' का उपयोग करते हैं। –

उत्तर

9

वहाँ गलत यहाँ कुछ चीजें हैं। पहला यह है कि आप पर 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 की वजह से, यदि आपका उपयोगकर्ता नोड्स पर विस्तार या पतन करने के लिए क्लिक करता है, तो आपके ट्रिगर्स प्राथमिकता सूची पर # 1 नहीं होंगे (यह एक स्थानीय मान है)। इसलिए, आपकी सबसे अच्छी शर्त MyStatus से bool में कनवर्ट करने के लिए एक नया IValueConverter बनाना है। और फिर सेटअप एक TwoWayStyle में एक Setter में बाध्यकारी:

<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; 
} 
+0

धन्यवाद, मैं कनवर्टर से बचने के लिए 'माइस्टैटस एनम फ़ील्ड' के अलावा सीधे एक बूलियन प्रॉपर्टी 'माईएक्सपेन्डेड' का उपयोग कर समाप्त हुआ ('कनवर्टबैक' समस्याग्रस्त हो जाएगा क्योंकि एनम में दो से अधिक मूल्य हैं)। –

1

मैं ऐसी ही कुछ करना था, और मैं इसे इस तरह से समाधान किया गया:

<TreeView ItemsSource="{Binding source}" 
      SnapsToDevicePixels="{Binding Path=myStatusToBool}" 
      > 
    <TreeView.ItemContainerStyle> 
    <Style> 
     <Setter Property="TreeViewItem.IsExpanded" 
       Value="False" 
       /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=SnapsToDevicePixels,RelativeSource={RelativeSource AncestorType=TreeView}}" 
        Value="True"> 
      <Setter Property="TreeViewItem.IsExpanded" 
        Value="True" 
        /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeView.Resources> 
    ..... 
    ..... 
    </TreeView.Resources> 
</TreeView> 
+0

Perdon पोर Algun Motivo से Borro ला प्राइमर एकतरफा: –

+0

+3

स्टैक ओवरफ़्लो एक बहुभाषी साइट नहीं है। कृपया अंग्रेजी में लिखें। –

संबंधित मुद्दे