我想把TabControl
的SelectedItem
绑定到视图模型中的一个对应字段,但是仍然声明TabControl
本身中的可用项(而不是使用ItemsSource
),并检索它们的Content
,就像实际的SelectedItem
一样。如果选择了一个选项卡,它的Content
应该最终成为SelectedItem
(而不是TabItem
),反之亦然。
示例视图模型,继承一个Caliburn. micron(!)集合:
public class MyViewModelConductor : Conductor<ConductedViewModelBase> {
public ViewModelA { get; set; }
public ViewModelB { get; set; }
}
和XAML中对应的TabControl
:
<TabControl SelectedItem="{Binding ActiveItem}">
<TabItem cal:View.Model="{Binding ViewModelA}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
<TabItem cal:View.Model="{Binding ViewModelB}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
</TabControl>
我知道我可以只使用Conductor<'1>.Collection.OneActive
并绑定到ItemsSource
,但有几个原因我不想这样做:
- 从指挥方可用的视图模型是由公开的属性声明的固定集合,而不是无限集合
- 对于UI方面,对于每个
TabItem
,我需要声明一个特定的头,其中包含许多与UI相关的东西(图标、颜色),这些东西是特定于平台的,因此我不想将其泄漏到我的视图模型中。
我尝试过利用SelectedValue
和SelectedValuePath
并绑定到TabControl本身(例如SelectedValue="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}" SelectedValuePath="Content"
),但一旦有一个属性被选中,WPF就会尝试在我的绑定视图模型上查找Content
属性。
1条答案
按热度按时间toe950271#
您必须将
SelectedValue
绑定到视图模型类,然后使用SelectedValuePath
声明SelectedItem
的哪个属性用作SelectedValue
。但是我不建议这样做。您应该将
ItemSource
绑定到一组数据模型,并定义DataTemplates,以给予干净的设计和动态/可扩展的行为。通常您会使用DataTemplate
作为TabControl.ContentTemplate
的模板,以模板化内容,使用TabControl.ItemTemplate
作为TabItem
(TabControl
头)的模板。不要硬编码
ItemsControl
项,它们绝对没有理由避免数据模板化。