Как получить количество строк в шаблоне селектора строк - wpf - gridcontrol - PullRequest
0 голосов
/ 02 июля 2019

Мне нужно получить количество строк GridControl в его RowTemplateSelector, чтобы изменить шаблон строк на основе этого числа. Я пытаюсь использовать поле контейнера, переданное методу Select () объекта TemplateSelector.

1 Ответ

2 голосов
/ 02 июля 2019

Вам не нужен conatiner-объект - посмотрите этот образец из DX-документов:

public class RowTemplateSelector : DataTemplateSelector
{
    public DataTemplate EvenRowTemplate { get; set; }
    public DataTemplate OddRowTemplate { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container) {

        RowData row = item as RowData; //<= mind this line of code!!!!

        if (row != null)
            return row.EvenRow ? EvenRowTemplate : OddRowTemplate;
        return base.SelectTemplate(item, container);
    }
}

Используя RowData-объект, вы можете получить доступ к соответствующему View-object

DataViewBase view = row.View;

Используя View-объект, вы можете получить доступ к соответствующему Grid-объекту

DataControlBase grid = view.DataControl;

Доступ к DataControl означает, что у вас есть доступ к его item-source

object o = grid.ItemsSource;

Оттуда вопрос каста и подсчета вашего фактического типа ItemsSource.Следующий TemplateSelector возвращает разные шаблоны в зависимости от того, меньше или меньше число элементов, чем десять:

public class RowTemplateSelector : DataTemplateSelector
{
    public DataTemplate SmallerThenTenTemplate { get; set; }
    public DataTemplate BiggerThenTenTemplate { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        RowData row = item as RowData; //<= mind this line of code!!!!
        object itemSource = row.View.DataControl.ItemsSource;
        IEnumerable<YourModelType> sourceList = (IEnumerable<YourModelType>)itemSource;

        if (sourceList.Count() > 10)
            return BiggerThenTenTemplate;
        else
            return SmallerThenTenTemplate;
    }
} 
...