wpf 在XAML中声明TabItem,将SelectedItem绑定到视图模型

js81xvg6  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(182)

我想把TabControlSelectedItem绑定到视图模型中的一个对应字段,但是仍然声明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相关的东西(图标、颜色),这些东西是特定于平台的,因此我不想将其泄漏到我的视图模型中。

我尝试过利用SelectedValueSelectedValuePath并绑定到TabControl本身(例如SelectedValue="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}" SelectedValuePath="Content"),但一旦有一个属性被选中,WPF就会尝试在我的绑定视图模型上查找Content属性。

toe95027

toe950271#

您必须将SelectedValue绑定到视图模型类,然后使用SelectedValuePath声明SelectedItem的哪个属性用作SelectedValue

<TabControl SelectedValuePath="Content"
            SelectedValue="{Binding ViewModelSelectedContentProperty}">
  <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>

但是我不建议这样做。您应该将ItemSource绑定到一组数据模型,并定义DataTemplates,以给予干净的设计和动态/可扩展的行为。通常您会使用DataTemplate作为TabControl.ContentTemplate的模板,以模板化内容,使用TabControl.ItemTemplate作为TabItemTabControl头)的模板。
不要硬编码ItemsControl项,它们绝对没有理由避免数据模板化。

相关问题