Pregunta

Quiero crear un elemento de WPF que, en tiempo de ejecución, está en pleno control de sus elementos secundarios - adición y eliminación de IU niño cuando sus propiedades cambio. Algo un poco como lo hace ItemsControl cuando se modifica su propiedad ItemsSource, aunque en mi caso no sólo será un niño.

Este será un contenedor de vista de MVVM - cuando se le da un modelo o de un modelo de vista, será mágicamente crear la correcta visión y alambre de todo. No hay necesidad de que mi vista de contenedor para ser templatable (ya que crea vistas definidas por el usuario, que son UserControls y tienen sus propias plantillas), y yo preferiría que encapsulan tanto como sea posible. Probablemente podría hacerlo fácilmente descendente de algo así como la rejilla, y la adición de controles secundarios cuando mis propias propiedades cambian; pero cuadrícula expone públicamente su colección de elementos secundarios y permite a cualquier persona agregar y quitar cosas.

¿Qué clase de WPF debería descender de encapsulación para una máxima, y ??cómo puedo añadir elementos secundarios para que en tiempo de ejecución?

Con base en mi comprensión de la documentación, He intentado utilizar FrameworkElement y AddVisualChild, sólo para ver si podía crear controles secundarios en tiempo de ejecución. No me queda claro si el AddLogicalChild es necesario, pero lo pongo en por si acaso:

public class ViewContainer : FrameworkElement {
    private TextBlock _child;

    public ViewContainer() {
        _child = new TextBlock { Text = "ViewContainer" };
        AddLogicalChild(_child);
        AddVisualChild(_child);
        InvalidateMeasure();
    }

    public object Content { get; set; }

    protected override Size ArrangeOverride(Size finalSize) {
        _child.Arrange(new Rect(finalSize));
        return finalSize;
    }
    protected override Size MeasureOverride(Size availableSize) {
        _child.Measure(availableSize);
        return _child.DesiredSize;
    }
}

Cuando pongo un ViewContainer en una ventana, y corro esto, espero ver un TextBlock diciendo "ViewContainer". Pero en cambio, sólo veo una ventana en blanco. Así que, obviamente me falta algo.

¿Cómo puedo solucionar el código anterior para que el control "niño" aparece en tiempo de ejecución, pero no está expuesta para que otros puedan meterse con (más de lo que puede evitarse)?

¿Fue útil?

Solución

Para responder a su pregunta específica, también necesita reemplazar y href="http://msdn.microsoft.com/en-us/library/system.windows.media.visual.visualchildrencount.aspx" rel="noreferrer"> propiedades VisualChildrenCount para permitir que su elemento secundario que se mostrará.

Otros consejos

¿Ha pensado en tomar ventaja del soporte de WPF para DataTemplates implícitos?

La forma en que he manejado un requisito similar a la suya es mediante el uso de un ContentControl. Ato la propiedad Content a mi modelo de vista. entonces me aseguro de que en Diccionarios recurso referenciado en algún lugar del árbol por encima de la ContentControl tengo DataTemplates definidos para todos los tipos de ViewModels que podrían ser asignados a la propiedad de contenido.

De esta manera WPF se encarga de cableado hasta el punto de vista correcto para mi modelo de vista.

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