Вопрос

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

Теперь у компонента есть 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> Управление<string> и т. д., все они происходят от Control, и, очевидно, вы не можете создавать шаблоны данных, ссылающиеся на общие типы.

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

Это было полезно?

Решение

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

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

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

Другие советы

В строке, где вы привязываете вложенный ItemsControl, правильный ли путь?Сейчас это «Controls», должно ли это быть «Controls»?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top