2011-04-19 11 views
9

मेरे पास Layers की एक सूची है जो TreeView पर बाध्य है जहां प्रत्येक उदाहरण में Effects की एक सूची है। मैं उन्हें एक पदानुक्रमित डेटाटाम्प्लेट के माध्यम से दिखाता हूं जो बहुत अच्छा काम करता है लेकिन मैं उन्हें SortDescriptions का उपयोग करके सॉर्ट करने का प्रयास कर रहा हूं।Xaml में SortDescriptions का उपयोग करके TreeView आइटम को कैसे क्रमबद्ध करें?

मैं कैसे XAML में ऐसा करने के लिए पता नहीं है, लेकिन ऐसा करने से वस्तुओं के केवल प्रथम स्तर, नहीं उप आइटम सॉर्ट करता: द्वारा

ICollectionView view = CollectionViewSource.GetDefaultView (treeView1.ItemsSource); 
view.SortDescriptions.Add (new SortDescription ("Name", ListSortDirection.Ascending)); 

मैं उन्हें .Color से पहले सॉर्ट करने के लिए कोशिश कर रहा हूँ, तो .Name

कोई विचार?

संपादित करें: मैं इस कोड कहा:

<Window.Resources> 

    <CollectionViewSource x:Key="SortedLayers" Source="{Binding AllLayers}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="Color" /> 
      <scm:SortDescription PropertyName="Name" /> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 

</Window.Resources> 

लेकिन यह अभी भी केवल पदानुक्रम के पहले के स्तर के लिए यह करता है। मैं इसे प्रत्येक परत के लिए कैसे निर्दिष्ट कर सकता हूं। प्रभाव संग्रह?

उत्तर

16

मैं उप आइटम को सॉर्ट करने के लिए कनवर्टर का उपयोग करने का सुझाव दूंगा। कुछ इस तरह:

<TreeView Name="treeCategories" Margin="5" ItemsSource="{Binding Source={StaticResource SortedLayers}}"> 
<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Effects, Converter={StaticResource myConverter}, ConverterParameter=EffectName}"> 
     <TextBlock Text="{Binding Path=LayerName}" /> 
     <HierarchicalDataTemplate.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=EffectName}" /> 
      </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

और कनवर्टर:


public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     System.Collections.IList collection = value as System.Collections.IList; 
     ListCollectionView view = new ListCollectionView(collection); 
     SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending); 
     view.SortDescriptions.Add(sort); 

     return view; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 
+0

बस एक बहुत छोटे से सुधार, मान परिवर्तित System.Collections.IList (System.Collections.IList) मान को शून्य संदर्भ को छोड़ने से बचने के लिए यदि मूल्य एक आईएलआईस्ट नहीं है (आपके पास अमान्यकास्ट अपवाद होना चाहिए) –

1

मैं एक बहु कनवर्टर का उपयोग कर बेहतर है:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows.Data; 

namespace Converters 
{ 
    [ValueConversion(typeof(object[]), typeof(ListCollectionView))] 
    public class IListToListCollectionViewConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      var Length = values.Length; 
      if (Length >= 1 && Length < 3) 
      { 
       var IList = values[0] as IList; 

       var SortName = string.Empty; 
       if (Length > 1) 
        SortName = values[1].ToString(); 

       var SortDirection = ListSortDirection.Ascending; 
       if (Length > 2) 
        SortDirection = values[2] is ListSortDirection ? (ListSortDirection)values[2] : (values[2] is string ? (ListSortDirection)Enum.Parse(typeof(ListSortDirection), values[2].ToString()) : SortDirection); 

       var Result = new ListCollectionView(IList); 
       Result.SortDescriptions.Add(new SortDescription(SortName, SortDirection)); 
       return Result; 
      } 
      return null; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
संबंधित मुद्दे