【问题标题】:How to bind the selectedvalue (header) of a TabControl to a property on a view model如何将 TabControl 的选定值(标题)绑定到视图模型上的属性
【发布时间】:2012-12-12 11:43:08
【问题描述】:

我有一个 tabcontrol 和一个 tabitems 集合。我想将 selectedvalue 的标题绑定到我的视图模型中的一个属性,这样我就知道何时选择了一个选项卡。

我的思考过程引导我尝试以下方法:

<TabControl x:Name="TabControl" SelectedValue.Header="{Binding SelectedTab}">

这不起作用 - 可能是因为 SelectedValue 不是 HeaderedContentControl 类型(尽管它总是在这种情况下)。

是否可以在 XAML 内联中进行强制转换,以便我可以执行上述操作?

或者任何人都可以提出另一种方法来有效地优雅地实现同样的事情吗?我不想更改 XAML 的代码隐藏。

【问题讨论】:

    标签: wpf xaml mvvm binding tabcontrol


    【解决方案1】:

    以下代码对我有用...

    C#:

    public class MyTabItemData     {
         public int Index { get; set; }
         public string Title { get; set; }
    } 
    
    public class MyTabControlViewModel {
         public List<MyTabItemData> TabItemsData { 
             get {
                 //return list of tab items data.
             } 
         }
    
         public ICollectionView TabItemsDataView {
              get {
                  return CollectionViewSource.GetDefaultView(TabItemsData);
              }
         }
    
         public MyTabItemData MyCurrentTabItemData {
              get {
                  return TabItemsDataView.CurrentItem as MyTabItemData;
              }
         }
    }
    

    XAML:

    <TabControl ItemsSource="{Binding TabItemsDataView}" 
                IsSynchronizedWithCurrentItem="True">
         ....
    </TabControl>
    

    【讨论】:

      【解决方案2】:

      而不是&lt;TabControl x:Name="TabControl" SelectedValue.Header="{Binding SelectedTab}"&gt; 绑定到 SelectedValue 并使用转换器来获取 Header,如下所示:

      <TabControl x:Name="TabControl" SelectedValue="{Binding Path=SelectedTab, Converter={StaticResource TabItemToHeader}}">
      

      你的转换器可能看起来像

      public class TabItemToHeaderConverter:IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              return ((TabItem)value).Header
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
          {
              return null;
          }
      } 
      

      Header没有附加属性,所以不能通过SelectedValue.Header="{}"绑定到它。

      【讨论】:

      • 是的,我曾想过这种方式,但认为会有类似内联 XAML 转换的东西(我认为没有)。
      • 转换器不是必须的,这样就可以了:Text="{Binding Path=SelectedItem.Header, ElementName=xxx}"
      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多