wpf xaml mvvm user-controls itemscontrol

WPF: ¿cómo puedo pasar otros controles a mi UserControl?



xaml mvvm (1)

Un par de notas primero:

  1. Un UserControl es un tipo de ContentControl . Esto significa que no puede pasar un elemento secundario al UserControl. Puede anular el contenido, pero eso sería infructuoso para lo que quiere lograr.
  2. Si desea un control que contenga un elemento hijo ÚNICO , está buscando una clase de Decorator .
  3. Si desea un control que contenga elementos secundarios MÚLTIPLES , está buscando una clase ItemsControl .

Entonces, básicamente lo estás haciendo incorrectamente. Dicho esto, hay un par de formas de lograr lo que quieres. Simplemente podría usar ItemsControl y anular la plantilla con su propia plantilla. También puede crear un CustomControl que herede de ItemsControl o Decorator.

Anular la plantilla (como estilo) será la forma más sencilla de hacerlo, por lo que mi sugerencia es hacer eso, a menos que esté muy bien informado sobre cómo crear un control personalizado WPF correctamente .

Si optas por un control personalizado, parece que probablemente quieras hacerlo como decorador (supongo que querrías tener un solo hijo aquí). La parte molesta es que para crear realmente un control personalizado WPF bien escrito, tendrás que tener algunas habilidades realmente buenas. Por ejemplo, Border es un tipo de Decorator que contiene algunas propiedades de DependencyProperty . La plantilla se envía con PresentationFramework.dll (creo) para que tenga una apariencia predeterminada. Un borde (control personalizado) no es tan difícil de escribir. Lo que se pone muy molesto es cuando realmente quieres tener lógica de interacción. Tendrá que poner controles y equilibrios para asegurarse de recuperar las referencias de control de la plantilla. Entonces, y solo entonces, si las referencias no son nulas, puedes continuar con tu lógica. Básicamente, supongamos que escribió un tipo de control personalizado que tiene 2 botones para realizar la lógica y proporcionó una plantilla predeterminada donde los botones se denominan "Botón 1" y "Botón 2". No puedes simplemente sacar el Botón 1 y el Botón 2 de la plantilla y esperar que estén allí; alguien podría anular fácilmente su plantilla predeterminada y eliminar el Botón 1 y el Botón 2, haciendo que su control personalizado sea inútil (casi). Lo que lo hace terrible es codificar sin tener en cuenta estas situaciones. Tu control personalizado se ejecutará en NullReferenceException . Sin mencionar que tendrás que cablear las cosas para permitir el botón PER de encuadernación por comando y también debes proporcionar un evento de ruta para cada botón. Básicamente, un control personalizado puede ser demasiado para lo que quiere hacer (posiblemente).

Podría estar equivocado, podrías ser muy hábil y saber cómo activar controles personalizados. O, mejor aún, es posible que haya deseado una forma simple de decorar su ItemsControl, por ejemplo, agregando un banner en la parte superior. No lo sé, pero estoy seguro de que lo haces :)

En general, vería cómo anular la plantilla ItemsControl. Aquí hay una muestra:

<Window x:Class="Sample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="640" Height="480"> <Window.Resources> <Style x:Key="ItemsControlStyle1" TargetType="{x:Type ItemsControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ItemsControl}"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> <StackPanel Orientation="Vertical"> <TextBlock Text="A HEADER!" /> <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </StackPanel> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid x:Name="LayoutRoot"> <ItemsControl Style="{DynamicResource ItemsControlStyle1}" /> </Grid> </Window>

Básicamente, quiero que mi UserControl sea capaz de incorporar un tipo de ItemsControl para que mi XAML pueda verse así:

<my:MyControl DataContext="{Binding InnerViewModel}"> <ItemsControl ... /> </my:MyControl>

De esta forma, MyControl muestra el control de Elementos personalizados junto con otros controles?