TabControl 中具有 MahApps.Metro 的多个视图模型
Multiple view models with MahApps.Metro within TabControl
我正在尝试让 TabControl 显示来自两个不同 categories/viewmodels 的保存数据。基于这两个资源,WPF MahApps.Metro Tabcontrol data bound? and DataTemplates aren't applied,我尝试了以下方法,但它并没有成功,因为它给出了编译错误。
<TabControl ItemsSource="{Binding Collection}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我有对应的类:
public class ViewModel {
public string Title { get; set; }
}
public class SubViewModelAlpha : ViewModel { }
public class SubViewModelBeta : ViewModel { }
// In another class, I have this property ...
public ObservableColletion<ViewModel> Collection {
get { return _collection; }
}
// ... and this list
private ObservableColletion<ViewModel> _collection;
我得到的错误是 "Property ContentTemplate is set more than once",这是有道理的,但是我如何在设置 ContentTemplate 之前对一种 ViewModel 应用相同类型的检查?
我已经尝试在 ContentTemplate 上使用 DataType
,但这不起作用。
PS!我当然想要每个视图模型中的更多数据,但是这个例子展示了我想要实现的目标的要点。
我认为这里的问题是它自己的内容模板只接受一个模板
, 就像你为单个 window 添加两个网格时它会告诉你内容 属性 不能设置多次
从基本的角度来看,我在这里想到的是,您可以做一个结合了两个模板的单一模板,并通过触发器和转换器在它们之间进行选择
编辑
查看这篇文章
http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector
阅读更多内容后,似乎可以使用 ContentTemplateSelector 解决问题,尽管我不确定是否存在任何奇怪的依赖关系。
我将 xaml 更改为:
<TabControl ItemsSource="{Binding Collection}"
ContentTemplateSelector="{DynamicResource MyContentTemplateSelector}">
<TabControl.Resource>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
<viewModels:MyContentTemplateSelector
x:Key="MyContentTemplateSelector"
AlphaTemplate="{StaticResource AlphaTemplate}"
BetaTemplate="{StaticResource BetaTemplate}" />
<TabControl.Resource>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
将以下 class 添加到我的项目中:
public class MyContentTemplateSelector : DataTemplateSelector
{
public DataTemplate AlphaTemplate { get; set; }
public DataTemplate BetaTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is SubViewModelAlpha)
return AlphaTemplate;
if (item is SubViewModelBeta)
return BetaTemplate;
return base.SelectTemplate(item, container);
}
}
此代码大致基于 Using ContentTemplateSelector,我不确定其中有哪些注意事项(如果有的话)。
不过,我确实相信可以使用直接使用数据类型的更好的解决方案,但我不知道如何实现!然而...
我正在尝试让 TabControl 显示来自两个不同 categories/viewmodels 的保存数据。基于这两个资源,WPF MahApps.Metro Tabcontrol data bound? and DataTemplates aren't applied,我尝试了以下方法,但它并没有成功,因为它给出了编译错误。
<TabControl ItemsSource="{Binding Collection}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我有对应的类:
public class ViewModel {
public string Title { get; set; }
}
public class SubViewModelAlpha : ViewModel { }
public class SubViewModelBeta : ViewModel { }
// In another class, I have this property ...
public ObservableColletion<ViewModel> Collection {
get { return _collection; }
}
// ... and this list
private ObservableColletion<ViewModel> _collection;
我得到的错误是 "Property ContentTemplate is set more than once",这是有道理的,但是我如何在设置 ContentTemplate 之前对一种 ViewModel 应用相同类型的检查?
我已经尝试在 ContentTemplate 上使用 DataType
,但这不起作用。
PS!我当然想要每个视图模型中的更多数据,但是这个例子展示了我想要实现的目标的要点。
我认为这里的问题是它自己的内容模板只接受一个模板 , 就像你为单个 window 添加两个网格时它会告诉你内容 属性 不能设置多次
从基本的角度来看,我在这里想到的是,您可以做一个结合了两个模板的单一模板,并通过触发器和转换器在它们之间进行选择
编辑
查看这篇文章 http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector
阅读更多内容后,似乎可以使用 ContentTemplateSelector 解决问题,尽管我不确定是否存在任何奇怪的依赖关系。
我将 xaml 更改为:
<TabControl ItemsSource="{Binding Collection}"
ContentTemplateSelector="{DynamicResource MyContentTemplateSelector}">
<TabControl.Resource>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
<viewModels:MyContentTemplateSelector
x:Key="MyContentTemplateSelector"
AlphaTemplate="{StaticResource AlphaTemplate}"
BetaTemplate="{StaticResource BetaTemplate}" />
<TabControl.Resource>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
将以下 class 添加到我的项目中:
public class MyContentTemplateSelector : DataTemplateSelector
{
public DataTemplate AlphaTemplate { get; set; }
public DataTemplate BetaTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is SubViewModelAlpha)
return AlphaTemplate;
if (item is SubViewModelBeta)
return BetaTemplate;
return base.SelectTemplate(item, container);
}
}
此代码大致基于 Using ContentTemplateSelector,我不确定其中有哪些注意事项(如果有的话)。
不过,我确实相信可以使用直接使用数据类型的更好的解决方案,但我不知道如何实现!然而...