Estoy desarrollando aplicación LOB, donde necesitaré varias ventanas de diálogo (y mostrar todo en una ventana no es una opción/no hace sentido).WPF: template o UserControl con 2 (o más) ContentPresenters para presentar contenido en 'slots'
Me gustaría tener un control de usuario de mi ventana que definiría algo más de estilo, etc., y no tendría varios ranuras donde el contenido se podría insertar - por ejemplo, la plantilla de una ventana de diálogo modal tendría una ranura para contenido y para botones (para que el usuario pueda proporcionar un contenido y un conjunto de botones con ICommands enlazados).
me gustaría tener algo como esto (pero esto no funciona): xaml
control de usuario:
<UserControl x:Class="TkMVVMContainersSample.Services.Common.GUI.DialogControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
>
<DockPanel>
<DockPanel
LastChildFill="False"
HorizontalAlignment="Stretch"
DockPanel.Dock="Bottom">
<ContentPresenter ContentSource="{Binding Buttons}"/>
</DockPanel>
<Border
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
Padding="8"
>
<ContentPresenter ContentSource="{Binding Controls}"/>
</Border>
</DockPanel>
</UserControl>
es algo como esto posible? ¿Cómo debo decirle a VS que mi control expone dos marcadores de posición de contenido para que pueda usarlo así?
<Window ... DataContext="MyViewModel">
<gui:DialogControl>
<gui:DialogControl.Controls>
<!-- My dialog content - grid with textboxes etc...
inherits the Window's DC - DialogControl just passes it through -->
</gui:DialogControl.Controls>
<gui:DialogControl.Buttons>
<!-- My dialog's buttons with wiring, like
<Button Command="{Binding HelpCommand}">Help</Button>
<Button Command="{Binding CancelCommand}">Cancel</Button>
<Button Command="{Binding OKCommand}">OK</Button>
- they inherit DC from the Window, so the OKCommand binds to MyViewModel.OKCommand
-->
</gui:DialogControl.Buttons>
</gui:DialogControl>
</Window>
O tal vez podría utilizar un ControlTemplate para una ventana like here, pero por otra parte: La ventana tiene sólo una ranura de contenido, por lo que su plantilla podrá tener sólo un presentador, pero necesito dos (y si en En este caso, podría ser posible ir con uno, hay otros casos de uso donde varios espacios de contenido vendrían a la mano, solo piense en una plantilla para el artículo: el usuario del control proporcionaría un título, contenido (estructurado), nombre del autor, imagen. ..).
¡Gracias!
PD: Si quisiera tener solo botones uno al lado del otro, ¿cómo puedo poner varios controles (botones) en StackPanel? ListBox tiene ItemsSource, pero no tiene StackPanel, y es propiedad de la Infancia es de sólo lectura - por lo que este no funciona (en el interior del control de usuario):
<StackPanel
Orientation="Horizontal"
Children="{Binding Buttons}"/>
EDIT: No quiero usar la unión, como lo quiere asignar un DataContext (ViewModel) a una ventana completa (que es igual a View), y luego vincularlo a sus comandos desde botones insertados en "slots" de control, por lo que cualquier uso de enlace en la jerarquía rompería la herencia de DC de View.
En cuanto a la idea de heredar de HeaderedContentControl - sí, en este caso funcionaría, pero ¿y si quiero tres partes reemplazables? ¿Cómo puedo crear mi propio "HeaderedAndFooteredContentControl" (o, ¿cómo implementaría HeaderedContentControl si no tuviera uno)?
Edit2: OK, así que mis dos soluciones doen't trabajo - esta es la razón: El ContentPresenter recibe su contenido desde el DataContext, pero necesito los enlaces en elementos contenidos para vincular a las ventanas originales (matriz de control de usuario en el árbol lógico) DataContext - porque de esta manera, cuando incrusto textbox vinculado a la propiedad de ViewModel, no está enlazado, como , la cadena de herencia se ha roto dentro del control!
Parece que necesitaría guardar el DataContext del padre y restaurarlo a los hijos de todos los contenedores del control, pero no me da ningún evento de que el DataContext en el árbol lógico haya cambiado.
EDIT3: ¡Tengo una solución!, borré mis servidores anteriores. Ver mi respuesta.
¡Gracias a Dios que alguien explicó esto de una manera simple y fácil de entender! Es difícil encontrar recursos sobre esto, o es solo una falla de wpf-beginners: p – Shion