在AvaloniaUI窗口,我想有一个TabControl
,其选项卡添加和删除的ObservableCollection<T>
。标签的“标题”(出现在标签条上的文本)应该设置在集合的每个项目中,这些项目可能属于不同的类型。
为此,我定义了一个类型:
public abstract class TabViewModelBase : ViewModelBase
{
public abstract string TabHeader { get; }
}
我的收藏是这样定义的:
public ObservableCollection<TabViewModelBase> OpenTabs { get; } = new();
在 axaml 文件中,这是以下内容的定义TabControl
:
<TabControl Items="{Binding OpenTabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabHeader}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
到目前为止,这就像一个魅力。
当我还想为每个选项卡内的视图设置一个容器时,问题就开始了,它不应该是包含的视图本身的一部分。我已经尝试通过编辑上面的 xaml 并设置ContentTemplate
如下:
<TabControl Items="{Binding OpenTabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabHeader}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<Border Child="{Binding}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
但是,这会导致以下错误:
[Binding] Error in binding to 'Avalonia.Controls.Border'.'Child': 'Could not convert 'Project.ViewModels.TestingViewModel' to 'IControl'.'
这似乎是因为ViewLocator
没有调用根据名称自动将视图模型与视图匹配的 。我认为这是因为我定义了一个DataTemplate
inside TabControl.ContentTemplate
。
是否可以指示 Avalonia 使用ViewLocator
inside TabControl.ContentTemplate
,以便根据其名称选择视图?
<Border Child="{Binding}"/>
Border 期望实际控件作为子控件,而不是视图模型。你需要ContentControl
改用。它还可以拥有自己的数据模板或视图定位器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句