Pergunta

Eu tenho um ItemsControl cuja ItemsSource fica vinculado a um ObservableCollection<Component> em tempo de execução. Tenho definido um modelo de dados para o tipo de componente que funciona bem.

Agora componente tem um ObservableCollection<Control> e eu quero adicionar outro ItemsControl dentro da minha datatemplate componente para tornar todos os controles. Controle aqui é o meu próprio objeto personalizado não relacionados a um controle WPF.

Existem diferentes tipos de controles assim que eu estou tentando usar um ItemTemplateSelector para selecionar o modelo certo para cada tipo. No exemplo abaixo para mantê-lo pequeno eu só têm mostrado um dos modelos "RWString" que eu acho usando uma FindResource em MyControlTemplateSelector primordial SelectTemplate. Mas o SelectTemplate nunca é chamado (usando um ponto de interrupção para verificar). Há algo de errado no meu 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>

Atualização: Contrls não é um erro de digitação, é só me usando um sistema de nomeação bobo. Contrls é uma propriedade do componente do tipo ObservableCollection. Também a razão pela qual eu estou tentando usar o do ItemsTemplateSelector é que o ObservableCollection<Control> contém objetos de tipos genéricos como Control<int> Control<string> etc todos decorrentes de Controle e, aparentemente, você não pode criar DataTemplates referindo-se a tipos genéricos.

Update3: atualização removido 2, uma vez que não estava relacionado. Eu tenho a ItemTemplateSelector ao trabalho, alterando StaticResource para DynamicResource. Mas eu não sei por que isso funciona ...

Foi útil?

Solução

Eu estou supondo que isso não funciona com um StaticResource como o recurso está dentro do ItemsControl que provavelmente não foi criado no tempo de carregamento quando StaticResources são avaliados.

DynamicResources no tempo de carregamento são avaliados para uma expressão em tempo de carregamento e depois avaliadas para o valor correto quando solicitado.

Tente mover o exterior de recursos do ItemsControl.

Outras dicas

Na linha onde se ligam a ItemsControl aninhada, é o caminho correto? É atualmente "Contrls", deveria ser "Controls"?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top