如何以编程方式从 AvalonDock Manager 激活(被选中)文档?

How to programatically Activate (being Selected) a Document from AvalonDockManager?

我已经从我的项目中的 AvalonDock 内容创建了一个 DockingManager,我的请求非常简单:当我将文档添加到我的 LayoutDocumentPaneGroup 时,我希望它处于活动状态、选中状态和不仅在 LayoutDocumentPaneGroup 的末尾添加还在第一个文档上激活。

我尝试对我的 documentView class 实施 IsActive 属性,但它不起作用。

我在 xaml 文件中的 dockingmanager 定义如下:

<dock:DockingManager DataContext="{Binding DockManagerViewModel}" DocumentsSource="{Binding Documents}"  AnchorablesSource="{Binding Anchorables}">
    <dock:DockingManager.Resources>
    <!-- add views for specific ViewModels -->
        <DataTemplate DataType="{x:Type vmdock:SampleDockWindowViewModel}">
            <uscontrol:SampleDockWindowView />
        </DataTemplate>
    </dock:DockingManager.Resources>
    <dock:DockingManager.LayoutItemContainerStyle>
                            <Style TargetType="{x:Type dockctrl:LayoutItem}">
                                <Setter Property="Title" Value="{Binding Model.Title}" />
                                <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
                                <Setter Property="CanClose" Value="{Binding Model.CanClose}" />
                            </Style>
                        </dock:DockingManager.LayoutItemContainerStyle>
                        <dock:LayoutRoot>
                            <dock:LayoutPanel Orientation="Vertical">
                                <dock:LayoutDocumentPaneGroup>
                                    <dock:LayoutDocumentPane />
                                </dock:LayoutDocumentPaneGroup>
                                <dock:LayoutAnchorablePaneGroup>
                                    <dock:LayoutAnchorablePane />
                                </dock:LayoutAnchorablePaneGroup>
                            </dock:LayoutPanel>
                        </dock:LayoutRoot>
                    </dock:DockingManager>

我的 documentView 是用 class 定义的,如下所示:

public abstract class DockWindowViewModel : BaseViewModel
{
    #region Properties

    #region CloseCommand
    private ICommand _CloseCommand;
    public ICommand CloseCommand
    {
        get
        {
            if (_CloseCommand == null)
                _CloseCommand = new RelayCommand(call => Close());
            return _CloseCommand;
        }
    }
    #endregion

    #region IsClosed
    private bool _IsClosed;
    public bool IsClosed
    {
        get { return _IsClosed; }
        set
        {
            if (_IsClosed != value)
            {
                _IsClosed = value;
                OnPropertyChanged(nameof(IsClosed));
            }
        }
    }
    #endregion

    #region CanClose
    private bool _CanClose;
    public bool CanClose
    {
        get { return _CanClose; }
        set
        {
            if (_CanClose != value)
            {
                _CanClose = value;
                OnPropertyChanged(nameof(CanClose));
            }
        }
    }
    #endregion

    #region Title
    private string _Title;
    public string Title
    {
        get { return _Title; }
        set
        {
            if (_Title != value)
            {
                _Title = value;
                OnPropertyChanged(nameof(Title));
            }
        }
    }
    #endregion

    #endregion

    public DockWindowViewModel()
    {
        CanClose = true;
        IsClosed = false;
    }

    public void Close()
    {
        IsClosed = true;
    }

终于找到了!我 post 结果是因为我认为我不会孤单... 首先,我将新的 属性 添加到我的文档视图定义中:

#region IsSelected
        private bool _isSelected = false;
        public bool IsSelected
        {
            get
            {
                return _isSelected;
            }
            set
            {
                if (_isSelected != value)
                {
                    _isSelected = value;
                    OnPropertyChanged(nameof(IsSelected));
                }
            }
        }
#endregion

但我还必须在我的 XAML 代码中将其实现为 属性,如下所示:

<dock:DockingManager.LayoutItemContainerStyle>
    <Style TargetType="{x:Type dockctrl:LayoutItem}">
        <Setter Property="Title" Value="{Binding Model.Title}" />
        <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
        <Setter Property="CanClose" Value="{Binding Model.CanClose}" />
        **<Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />**
    </Style>
</dock:DockingManager.LayoutItemContainerStyle>

假设它对此处定义的 LayoutContent 的所有属性都有效:LayoutDocument defined by AvalonDock

编辑: 还需要添加 "Mode=TwoWay" 以在所选内容更改时以编程方式更新,如下所示:

<Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}" />

正如我在对已接受答案的评论中提到的那样,这对我不起作用,所以我继续尝试。不过,我的情况可能有所不同。我正在使用 Stylet,我的 DockManager.DocumentsSource 绑定到 ViewModel 中 Conductor<MyViewModelBase>.Collection.OneActive DocumentsItems 属性。在这种情况下,我需要做两件事来激活添加的文档:

  1. DockingManager.ActiveContent 绑定到 Documents.ActiveItem
  2. Documents.Items.Add(an_instance_of_my_viewmodel); 之后使用 Documents.ActivateItem(vm);
  3. 激活新的 ViewModel