使用 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}" />
我正在尝试将 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}" />