WPF Datatemplating ItemsControl - PullRequest
       7

WPF Datatemplating ItemsControl

1 голос
/ 03 января 2009

У меня есть ItemsControl, у которого ItemsSource связан с ObservableCollection < Component> во время выполнения. Я определил шаблон данных для компонента типа, который работает нормально.

Теперь у компонента есть ObservableCollection < Control>, и я хочу добавить еще один ItemsControl внутри моей таблицы данных компонента, чтобы отобразить все элементы управления. Элемент управления здесь - это мой собственный объект, не связанный с элементом управления wpf.

Существуют различные типы элементов управления, поэтому я пытаюсь использовать ItemTemplateSelector, чтобы выбрать правильный шаблон для каждого типа. В приведенном ниже примере, чтобы сохранить его небольшим, я показал только один из шаблонов «RWString», который я нахожу, используя FindResource в MyControlTemplateSelector, переопределяя SelectTemplate. Но SelectTemplate никогда не вызывается (используя точку останова для проверки). Что-то не так в моем xaml?

<ItemsControl.Resources>
    <src:MyControlTemplateSelector x:Key="XSelector" />
    <DataTemplate DataType="{x:Type src:Component}"  >
        <Expander Visibility="{Binding Path=Show}">
                <ItemsControl ItemsSource="{Binding Path=Contrls}" 
                          ItemTemplateSelector="{StaticResource XSelector}">
                <ItemsControl.Resources>
                    <DataTemplate x:Key="RWstring" >
                        <TextBlock Text="{Binding Path=Label}"/>
                    </DataTemplate>
                </ItemsControl.Resources>
                <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate><WrapPanel /></ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Expander>
    </DataTemplate>
</ItemsControl.Resources>

Обновление: Contrls - это не опечатка, просто я использую систему глупых имен. Contrls - это свойство компонента типа ObservableCollection. Кроме того, причина, по которой я пытаюсь использовать ItemsTemplateSelector, заключается в том, что ObservableCollection < Control> содержит объекты универсальных типов, таких как Control < int> Control < string> и т. Д., Все они получены из Control, и, очевидно, вы не можете создавать шаблоны данных, ссылающиеся на на общие типы.

Обновление 3: Удалено обновление 2, поскольку оно не было связано. Я получил ItemTemplateSelector для работы, изменив StaticResource на DynamicResource. Но я не знаю, почему это работает ...

Ответы [ 2 ]

1 голос
/ 04 января 2009

Я предполагаю, что это не работает со StaticResource, так как Resource находится внутри ItemsControl, который, вероятно, не был создан во время загрузки при оценке StaticResources.

DynamicResources во время загрузки оценивается как выражение во время загрузки, а затем по запросу оценивается в правильное значение.

Попробуйте переместить ресурс за пределы ItemsControl.

0 голосов
/ 03 января 2009

В строке, где вы связываете вложенный ItemsControl, путь правильный? Это в настоящее время "Contrls", это должно быть "Controls"?

...