使用 MVVM 时如何禁用 LayoutAnchorable 的隐藏

How to disable hiding of a LayoutAnchorable when using MVVM

我正在尝试将 AvalonDock 与 MVVM 一起使用并禁用 LayoutAnchorable 的隐藏功能。没有 MVVM,我可以做类似的事情:

<xcad:LayoutAnchorable CanHide="False">
  <TextBox>Some Content</TextBox>
</xcad:LayoutAnchorable>

CanHide="False" 禁用隐藏。

如何使用 MVVM 访问 CanHide 属性 或以其他方式禁用隐藏?

我有:

<xcad:DockingManager AnchorablesSource="{Binding UserPanelList}">
  <xcad:DockingManager.LayoutItemContainerStyle>
    <Style TargetType="xcad:LayoutItem">
      <Setter Property="Title" Value="{Binding Model.Title}" />
      <Setter Property="ContentId" Value="{Binding Model.ContentId}" />
    </Style>
  </xcad:DockingManager.LayoutItemContainerStyle>

  <xcad:DockingManager.LayoutItemTemplate>
    <DataTemplate>
      <ContentPresenter Content="{Binding Control}" />
    </DataTemplate>
  </xcad:DockingManager.LayoutItemTemplate>

  <xcad:LayoutRoot>
    <xcad:LayoutPanel Orientation="Horizontal">
      <xcad:LayoutAnchorablePane>
      </xcad:LayoutAnchorablePane>
    </xcad:LayoutPanel>
  </xcad:LayoutRoot>
</xcad:DockingManager>

还有一个完全微不足道的模型class:

public class UserPanel : INotifyPropertyChanged
{
  public string Title { get; set; }
  public string ContentId { get; set; }
  public bool CanHide { get; set; }         // ??
  // (NotifyPropertyChanged not implemented for these properties here
  // for the sake of brevity. Basically works without.)

  public UserControl Control
  {
    get => _userInterface;
    set
    {
      if (value != _userInterface)
      {
        _userInterface = value;
        OnPropertyChanged();
      }
    }
  }
  UserControl _userInterface;

  public event PropertyChangedEventHandler PropertyChanged;

  void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

视图 classes 是根据绑定 UserPanelList 的内容创建的。

但是,LayoutItem class 不包含 CanHide 属性,即我不能使用 <Setter> afaik。我可以做什么?

派生自LayoutItem的class LayoutAnchorableItem用于LayoutAnchorable(参见e.g. here)。它具有按预期工作的依赖项 属性 CanHide

On 可以通过

设置 LayoutAnchorableItem 的样式
<Style TargetType="xcad:LayoutAnchorableItem">
  <!-- ... -->
  <Setter Property="CanHide" Value="{Binding Model.CanHide}" />

或者,更灵活,通过

<Style TargetType="xcad:LayoutItem">
  <!-- ... -->
  <Setter Property="xcad:LayoutAnchorableItem.CanHide" Value="{Binding Model.CanHide}" />