Я разрабатываю приложение LOB, где мне понадобится несколько диалоговых окон (и отображение всего в одном окне не является опцией/не делает смысл).WPF: шаблон или UserControl с 2 (или более!) ContentPresenters для представления содержимого в слотах
Я хотел бы иметь пользовательский элемент управления для моего окна, который будет определять некоторый стиль и т.д., и буду иметь несколько слотов, где содержание может быть вставленными - например, шаблон модального диалогового окна будет иметь слот для контента и кнопок (чтобы пользователь мог затем предоставить контент и набор кнопок со связанными ICommands).
Я хотел бы иметь что-то подобное (но это не работает):
UserControl XAML:
<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>
ли что-то подобное возможно? Как мне сказать VS, что мой элемент управления предоставляет два заполнителя содержимого, чтобы я мог использовать его так?
<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>
Или, может быть, я мог бы использовать ControlTemplate для окна like here, но потом снова: Окно имеет только один слот контента, поэтому его шаблон будет иметь возможность иметь только один ведущий, но мне нужно два (и если в в этом случае, возможно, возможно, что с ним можно пойти, есть другие варианты использования, в которых будут присутствовать несколько слотов контента, просто подумайте о шаблоне для пользователя, контролирующего статьи, который предоставит заголовок, (структурированный) контент, имя автора, изображение. ..).
Спасибо!
PS: Если бы я хотел просто иметь кнопки рядом, как я могу добавить несколько элементов управления (кнопок) в StackPanel? ListBox имеет ItemsSource, но StackPanel не имеет, и это дети свойство только для чтения - так это не работает (внутри UserControl):
<StackPanel
Orientation="Horizontal"
Children="{Binding Buttons}"/>
EDIT: Я не хочу использовать привязку, как я захотите присвоить DataContext (ViewModel) целое окно (которое равно View), а затем привязать его к командам из кнопок, вставленных в «слоты» управления, - поэтому любое использование привязки в иерархии нарушит наследование DC View.
Что касается идеи наследования от HeaderedContentControl - да, в этом случае это сработает, но что, если я хочу три заменяемые части? Как я могу создать свой собственный «HeaderedAndFooteredContentControl» (или, как я могу реализовать HeaderedContentControl, если у меня его нет)?
EDIT2: КИ, так что мои два решения doen't работы - вот почему: ContentPresenter получает это содержимое из DataContext, но мне нужна привязки на содержатся элементы для ссылки на оригинальные окна (родитель UserControl в в логическом дереве) DataContext - потому что таким образом, когда я вставляю текстовое поле, связанное с свойством ViewModel, оно не связано, так как цепочка наследования была нарушена внутри элемента управления!
Кажется, что мне нужно сохранить DataContext родителя и восстановить его для дочерних элементов всех контейнеров управления, но я не получаю никакого события, которое DataContext в логическом дереве изменилось.
EDIT3: У меня есть решение!, удалил мои предыдущие аверы. См. Мой ответ.
Слава богу, кто-то объяснил это простым и понятным способом! Трудно найти ресурсы об этом, или это просто ошибка wpf-beginners: p – Shion