Pregunta

Tengo un ItemsControl cuyo ItemsSource se une a un ObservableCollection < Component > en tiempo de ejecución. He definido una plantilla de datos para el tipo Componente que funciona bien.

Ahora el componente tiene una ObservableCollection <=> Control > y quiero agregar otro ItemsControl dentro de mi Component Datatemplate para representar todos los controles. El control aquí es mi propio objeto personalizado no relacionado con un control wpf.

Hay diferentes tipos de controles, así que estoy tratando de usar un ItemTemplateSelector para seleccionar la plantilla correcta para cada tipo. En el ejemplo a continuación para mantenerlo pequeño, solo he mostrado una de las plantillas & Quot; RWString & Quot; que encuentro usando un FindResource en MyControlTemplateSelector anulando SelectTemplate. Pero SelectTemplate nunca se llama (usando un punto de interrupción para verificar). ¿Hay algo mal en mi 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>

Actualización: Contrls no es un error tipográfico, solo soy yo usando un sistema de nombres tonto. Contrls es una propiedad de Componente de tipo ObservableCollection. También la razón por la que estoy tratando de usar ItemsTemplateSelector es que ObservableCollection <=> Control & Gt; contiene objetos de tipos genéricos como Control <=> int > Control <=> cadena & Gt; etc. todo derivado de Control y aparentemente no puede crear plantillas de datos que se refieran a tipos genéricos.

Actualización3: Se eliminó la actualización 2 porque no estaba relacionada. Obtuve el ItemTemplateSelector para trabajar cambiando StaticResource a DynamicResource. Pero no sé por qué esto funciona ...

¿Fue útil?

Solución

Supongo que esto no funciona con un StaticResource ya que el Recurso está dentro del ItemsControl que probablemente no se haya creado en el momento de la carga cuando se evalúan los StaticResources.

DynamicResources en el momento de la carga se evalúa como una expresión en el momento de la carga y luego se evalúa con el valor correcto cuando se solicita.

Intenta mover el Recurso fuera de ItemsControl.

Otros consejos

En la línea donde enlaza el ItemsControl anidado, ¿es correcta la ruta? Actualmente es & Quot; Contrls & Quot ;, debería ser & Quot; Controls & Quot ;?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top