gpt4 book ai didi

wpf - View 集合中的 TabItems

转载 作者:行者123 更新时间:2023-12-04 19:46:54 24 4
gpt4 key购买 nike

我正在使用 MVVM。我有一个选项卡控件。我将收集物品。我想将集合中的每个项目都显示为选项卡项目。每个选项卡项中的 View 都不同,并且可能有自己的 View 模型。我如何实现这一目标?
例如。我的收藏中有 3 件物品。 Tab 项模板包含一个 ItemControl。我想现在创建 3 个选项卡,每个选项卡内的 ItemControls 可能会显示不同的 View 。

我可以做的一种方法是为每个项目创建一个 View 和 View 模型。现在基于某些条件, View 将显示不同的 UI 元素并表现出不同的行为。但恐怕这会使 View 在一段时间内变得相当复杂。

编辑:下面的 Goblin 解决方案工作正常,但是当自定义样式应用于 TabControl 时出现问题。

<Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/> <ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" Name="RowDefinition0" />
<RowDefinition Height="*" Name="RowDefinition1" />
</Grid.RowDefinitions>
<TabPanel Grid.Column="0" Grid.Row="0" />
<Border Grid.Column="0" Grid.Row="1">
<ContentPresenter Content="{TemplateBinding TabControl.SelectedContent}" ContentTemplate="{TemplateBinding TabControl.SelectedContentTemplate}" ContentStringFormat="{TemplateBinding TabControl.SelectedContentStringFormat}" ContentSource="SelectedContent" Name="PART_SelectedContentHost" Margin="{TemplateBinding Control.Padding}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
</Grid>
<ControlTemplate.Triggers>

编辑:这已通过将 ContentTemplateSelector 添加到上述 TabControl 样式中的 ContentPresenter 来解决

最佳答案

您是否尝试过使用 DataTemplateSelectors?

基本上,您在主 ViewModel 中发布了一组较小的 ViewModel - 然后在 DataTemplateSelector 中根据 ViewModel 的类型选择您的模板?

<UserControl.Resources>
<DataTemplate x:Key="HeaderTemplate">
<TextBlock Text="CMR"/>
</DataTemplate>
<DataTemplate x:Key="FirstTemplate">
<local:FirstView/>
</DataTemplate>
<DataTemplate x:Key="SecondTemplate">
<lcoal:SecondView/>
</DataTemplate>
<local:TemplateSelector x:Key="TemplateSelector" FirstTypeTemplate="{StaticResource FirstTemplate}" SecondTypeTemplate={StaticResource SecondTemplate}/>
</UserControl.Resources>
<TabControl ItemsSource="{Binding SmallerViewModels}" ContentTemplateSelector="{StaticResource TemplateSelector}" ItemTemplate="{StaticResource HeaderTemplate}">

在代码隐藏中:
public class TemplateSelector:DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if(item.GetType() == typeof(FirstViewModel)
return FirstTypeTemplate
return SecondTypeTemplate;
}
public DataTemplate FirstTypeTemplate { get; set; }
public DataTemplate SecondTypeTemplate { get; set; }
}

编辑:
View 模型:
public class SharedViewModel
{
public SharedViewModel()
{
SmallerViewModels = new List<ISmallViewModel>();
SmallerViewModels.Add(new FirstViewModel());
SmallerViewModels.Add(new SecondViewModel());
}
public IList<ISmallViewModel> SmallerViewModels{get;private set;}
}
public interface ISmallViewModel{}
public class FirstViewModel:ISmallViewModel
{
public string FirstDescription
{
get{return "My first ViewModel";}
}
}
public class SecondViewModel:ISmallViewModel
{
public string SecondDescription
{
get{return "My second ViewModel";}
}
}

View
<UserControl  .... x:Class="...FirstView">
<TextBlock Text="{Binding FirstDescription}"
</UserControl>
<UserControl .... x:Class="...SecondView">
<TextBlock Text="{Binding SecondDescription}"
</UserControl>

关于wpf - View 集合中的 TabItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3005432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com