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

时间:2018-07-20 09:42:58

标签: wpf mvvm avalondock

我正在尝试将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>

还有一个完全平凡的模型类:

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));
  }
}

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

但是,LayoutItem类不包含CanHide属性,即我不能使用<Setter> afaik。我该怎么办?

1 个答案:

答案 0 :(得分:0)

LayoutAnchorableItem派生的类LayoutItem用于LayoutAnchorable(请参阅e.g. here)。它具有一个依赖属性CanHide,该属性可以按预期工作。

打开可以通过以下方式设置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}" />