如何以编程方式从 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 Documents
的 Items
属性。在这种情况下,我需要做两件事来激活添加的文档:
- 将
DockingManager.ActiveContent
绑定到 Documents.ActiveItem
- 在
Documents.Items.Add(an_instance_of_my_viewmodel);
之后使用 Documents.ActivateItem(vm);
激活新的 ViewModel
我已经从我的项目中的 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 Documents
的 Items
属性。在这种情况下,我需要做两件事来激活添加的文档:
- 将
DockingManager.ActiveContent
绑定到Documents.ActiveItem
- 在
Documents.Items.Add(an_instance_of_my_viewmodel);
之后使用Documents.ActivateItem(vm);
激活新的 ViewModel