C# 使用不同的用户控件创建选项卡项';制表符控制
首先,我对WPF和MVVM有点陌生,所以你可以期待这里有一些疯狂的混合,只是建议更改,我来学习。C# 使用不同的用户控件创建选项卡项';制表符控制,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,首先,我对WPF和MVVM有点陌生,所以你可以期待这里有一些疯狂的混合,只是建议更改,我来学习。 这个问题是我的继续 我有一个TabControl,在XAML中定义了一些TabItem,每个选项卡都有自己的UserControl XAML 如果我使用上面链接的答案的示例运行良好,我可以单独创建选项卡,结果选项卡和配置选项卡保持不变。 但是,如果我使用UserControl新的TabItem我从我的集合中创建,则将我的UserControl放入TabItem.Header 如果我没有遵循MVV
这个问题是我的继续 我有一个
TabControl
,在XAML
中定义了一些TabItem
,每个选项卡都有自己的UserControl
XAML
如果我使用上面链接的答案的示例运行良好,我可以单独创建选项卡,结果选项卡和配置选项卡保持不变。但是,如果我使用
UserControl
新的TabItem
我从我的集合中创建,则将我的UserControl
放入TabItem.Header
如果我没有遵循MVVM,并且我创建了一个
observateCollection
按预期工作,那么我假设问题出现在选项卡control.DataTemplate
如有任何想法或建议,将不胜感激
编辑:由于应用程序和相关代码的复杂性,我无法提供一个工作示例,因此我添加以下图片来解释问题:
期望视图
使用
ContentTemplateSelector
内部TabControl
<Window.Resources>
<DataTemplate x:Key="DetailedTemplate" DataType="{x:Type viewModels:DetailedViewModel}">
<views:DetailedView/>
</DataTemplate>
<DataTemplate x:Key="ConfigurationTemplate" DataType="{x:Type viewModels:ConfigurationViewModel}">
<views:ConfigurationView />
</DataTemplate>
<DataTemplate x:Key="ResultTemplate" DataType="{x:Type viewModels:ResultViewModel}">
<views:ResultView/>
</DataTemplate>
<helpers:MyViewSelector x:Key="Selector"
DetailedTemplate="{StaticResource DetailedTemplate}"
ConfigurationTemplate="{StaticResource ConfigurationTemplate}"
ResultTemplate="{StaticResource ResultTemplate}"/>
</Window.Resources>
助手
public class MyViewSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object inItem, DependencyObject container)
{
if (inItem == null)
{
return ResultTemplate;
}
if (inItem is DetailedViewModel)
{
return DetailedTemplate;
}
if (inItem is ResultViewModel)
{
return ResultTemplate;
}
if (inItem is ConfigurationViewModel)
{
return ConfigurationTemplate;
}
return ResultTemplate;
}
public DataTemplate DetailedTemplate { get; set; }
public DataTemplate ConfigurationTemplate { get; set; }
public DataTemplate ResultTemplate { get; set; }
}
来源:您尚未提供您的问题的最小、完整且可验证的示例:。除了硬编码的选项卡,您是否看到了所有选项卡?或者您的问题是什么?我尝试过。但由于这是一个复杂的问题,我无法为视图和viewsModel提供所有必要的代码,因为它抱怨“您的问题上有太多代码”。你可以告诉我你错过了什么,我可以试着为它提供编辑。最小视图模型和最小视图都可以编译。当我在
TabItemsVM
中添加新对象时,“硬编码”选项卡会消失。我将试着准备一个简单的例子。ContentPresenter
应该只在ControlTemplate
中使用,而不是使用ContentControl
。
<TabControl Grid.Row="1"
Grid.Column="0"
VerticalAlignment="Stretch"
BorderThickness="0.5"
BorderBrush="Black"
ContentTemplateSelector="{StaticResource Selector}">
<TabControl.Resources>
<CollectionViewSource Source="{Binding Model.DetailsVM}" x:Key="Tabs"/>
<DataTemplate DataType="{x:Type viewModels:DetailedViewModel}">
<TextBlock Text="{Binding Model.SelectedItem.FileInfo.Name, Mode=OneWay}"/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemsSource>
<CompositeCollection>
<!--Result View-->
<TabItem Header="Import" Content="{Binding ResultViewModel}"/>
<!--Configuration Tab-->
<TabItem Header="Configuration" Content="{Binding ConfigViewModel}"/>
<!--Others-->
<CollectionContainer Collection="{Binding Source={StaticResource Tabs}}"/>
</CompositeCollection>
</TabControl.ItemsSource>
</TabControl>
public class MyViewSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object inItem, DependencyObject container)
{
if (inItem == null)
{
return ResultTemplate;
}
if (inItem is DetailedViewModel)
{
return DetailedTemplate;
}
if (inItem is ResultViewModel)
{
return ResultTemplate;
}
if (inItem is ConfigurationViewModel)
{
return ConfigurationTemplate;
}
return ResultTemplate;
}
public DataTemplate DetailedTemplate { get; set; }
public DataTemplate ConfigurationTemplate { get; set; }
public DataTemplate ResultTemplate { get; set; }
}