Размещение LayoutContent по умолчанию в панелях при использовании MVVM - PullRequest
0 голосов
/ 31 августа 2018

При использовании 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.)
}

Это помещает два якоря в одну и ту же панель в штабеле. Как я могу разместить крепления в разных плоскостях?

...