CollectionViewSource とコンバーター クラス (CollectionViewFactoryConverter) を介して HierachicalDataTemplate を並べ替えようとしています。これは、ツリービューのすべてのレベルを並べ替えることができる完璧なソリューションです。DevExpress の DXTreelist を使用していますが、これが問題の原因ではないと思います。
私の問題: コンバーターがトリガーされません。Convert メソッドまたは ConvertBack メソッドにブレークポイントを設定できますが、そこに到達することはありません。なぜ反応がないのか理解できません。- 誰か助けてくれませんか?
WPF コード:
<Window.Resources>
<view:CollectionViewFactoryConverter x:Key="collectionViewFactoryConverter" />
<local:MyTemplateSelector x:Key="templateSelector" />
<local:ContentToTreeListNodeConverter x:Key="contentToTreeListNodeConverter"/>
<CollectionViewSource Source="{Binding Path=Data, Mode=TwoWay}" x:Key="cvsRoot">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="StandardTemplate">
<TextBlock Text="Template Not Found!" />
</DataTemplate>
<HierarchicalDataTemplate x:Key="RootTemplate"
ItemsSource="{Binding RefA, Converter={StaticResource collectionViewFactoryConverter}, ConverterParameter=Row.Name}">
<TextBlock Text="{Binding Row.Name}" />
</HierarchicalDataTemplate>
<!--Code below is working, but results are unsorted-->
<!--<HierarchicalDataTemplate x:Key="RootTemplate" ItemsSource="{Binding RefA}">
<TextBlock Text="{Binding Row.Name}" />
</HierarchicalDataTemplate>-->
<HierarchicalDataTemplate x:Key="ModelATemplate" ItemsSource="{Binding RefB}">
<TextBlock Text="{Binding Row.Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ModelBTemplate">
<TextBlock Text="{Binding Row.Name}" />
</HierarchicalDataTemplate>
</Window.Resources>
TreelistControl のコード:
<dxgcore:TreeListControl Name="treeListControl"
DesignTimeShowSampleData="False"
ItemsSource="{Binding Source={StaticResource cvsRoot}}"
Grid.ColumnSpan="2" Margin="123,0,0,0" ItemsSourceChanged="treeListControl_ItemsSourceChanged">
<dxg:TreeListControl.View>
<dxg:TreeListView Name="tlvList"
IsColumnMenuEnabled="False"
AllowPerPixelScrolling="True"
AutoWidth="True"
ShowHorizontalLines="False"
ShowVerticalLines="False"
ShowIndicator="False"
ShowFocusedRectangle="False"
NavigationStyle="Row"
TreeLineStyle="Solid"
FixedLineWidth="1"
FilterEditorShowOperandTypeIcon="True"
DataRowTemplateSelector="{StaticResource templateSelector}"
TreeDerivationMode="HierarchicalDataTemplate"
FocusedNode="{Binding HierarchicalFilterSelection, Mode=OneWayToSource}"
>
</dxg:TreeListView>
</dxg:TreeListControl.View>
</dxgcore:TreeListControl>
コンバーター クラス:
[ValueConversion(typeof(System.Collections.IList), typeof(System.Collections.IEnumerable))]
public class CollectionViewFactoryConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
System.Collections.IList collection = (System.Collections.IList)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;
}
}
テンプレート セレクターは次のようになります。
public class MyTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
DataTemplate template = null;
if (item != null)
{
FrameworkElement element = container as FrameworkElement;
if (element != null)
{
string templateName = "StandardTemplate";
DevExpress.Xpf.Grid.TreeList.TreeListRowData itemAsTreelistRowData = null;
if (item is DevExpress.Xpf.Grid.TreeList.TreeListRowData)
{
itemAsTreelistRowData = item as DevExpress.Xpf.Grid.TreeList.TreeListRowData;
}
if (itemAsTreelistRowData.Row is Root)
{
templateName = "RootTemplate";
}
else
if (itemAsTreelistRowData.Row is ModelA)
{
templateName = "ModelATemplate";
}
else
if (itemAsTreelistRowData.Row is ModelB)
{
templateName = "ModelBTemplate";
}
template = element.FindResource(templateName) as DataTemplate;
}
}
return template;
}
}