При использовании MVVM с AvalonDock, как я могу обеспечить размещение LayoutAnchorables и LayoutDocuments по умолчанию на разных панелях?
Конечно, смысл чего-то похожего на AvalonDock состоит в том, чтобы дать пользователю возможность размещать компоненты пользовательского интерфейса так, как ему нравится, но я хотел бы предоставить приличный макет по умолчанию.
(Очень простой) пример:
Без MVVM довольно просто расположить два LayoutAnchorables рядом:
<xcad:DockingManager x:Name="MyDockingManager">
<xcad:LayoutRoot>
<xcad:LayoutPanel>
<xcad:LayoutAnchorablePane>
<xcad:LayoutAnchorable Title="Foo">
<TextBox Text="foo" />
</xcad:LayoutAnchorable>
</xcad:LayoutAnchorablePane>
<xcad:LayoutAnchorablePane>
<xcad:LayoutAnchorable Title="Bar">
<TextBox Text="bar" />
</xcad:LayoutAnchorable>
</xcad:LayoutAnchorablePane>
</xcad:LayoutPanel>
</xcad:LayoutRoot>
</xcad:DockingManager>
С MVVM у меня есть что-то вроде этого:
<xcad:DockingManager AnchorablesSource="{Binding Anchorables}">
<xcad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="xcad:LayoutItem">
<Setter Property="Title" Value="{Binding Model.Title}" />
</Style>
</xcad:DockingManager.LayoutItemContainerStyle>
<xcad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Content}" />
</DataTemplate>
</xcad:DockingManager.LayoutItemTemplate>
<xcad:LayoutRoot>
<xcad:LayoutPanel>
<xcad:LayoutAnchorablePane>
</xcad:LayoutAnchorablePane>
<xcad:LayoutAnchorablePane>
<!-- How to place something in here? -->
</xcad:LayoutAnchorablePane>
</xcad:LayoutPanel>
</xcad:LayoutRoot>
</xcad:DockingManager>
С некоторым кодом позади:
public MainWindow()
{
DataContext = this;
Anchorables = new ObservableCollection<AnchorableViewModel>() {
new AnchorableViewModel("foo"),
new AnchorableViewModel("bar")
};
InitializeComponent();
}
public ObservableCollection<AnchorableViewModel> Anchorables { get; }
И очень простой вид модели:
public class AnchorableViewModel
{
public AnchorableViewModel(string title)
{
Title = title;
Content = new TextBox() { Text = title };
}
public string Title { get; }
public UIElement Content { get; }
// (No INotifyPropertyChanged for sake of brevity, this example works without.)
}
Это помещает два якоря в одну и ту же панель в штабеле. Как я могу разместить крепления в разных плоскостях?