Конвертер никогда не вызывается при попытке сортировки HierachicalDataTemplate через CollectionViewSource и Converter - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь отсортировать шаблон HierachicalDataTemplate через CollectionViewSource и класс конвертера (CollectionViewFactoryConverter), который должен быть идеальным решением для сортировки всех уровней древовидной структуры.Я использую DXTreelist от DevExpress, но я предполагаю, что это не источник моей проблемы.

Моя проблема: Конвертер никогда не запускается.Я могу поставить точку останова в метод 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;
    }
}

TheСелектор шаблонов выглядит следующим образом:

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

}

1 Ответ

0 голосов
/ 27 января 2012

Попробуйте вызвать конвертер прямо в привязке для ItemsSource в вашем TreeListControl:

  ItemsSource="{Binding Source={StaticResource cvsRoot}, Converter={StaticResource collectionViewFactoryConverter}}"
...