如何将TabControl的selectedvalue(标题)绑定到视图模型上的属性

时间:2012-12-12 11:43:09

标签: wpf xaml mvvm binding tabcontrol

我有一个tabcontrol并在一组tabitems中。我想将selectedvalue的标题绑定到我的viewmodel中的属性,以便我知道何时选择了一个标签。

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

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

这不起作用 - 可能是因为SelectedValue不是HeaderedContentControl类型(尽管它总是在这个实例中)。

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

或者,任何人都可以建议另一种方式来有效地实现同样的事情吗?我不想改变XAML的代码隐藏。

2 个答案:

答案 0 :(得分:2)

以下代码适用于我...

<强> 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>

答案 1 :(得分:1)

而不是<TabControl x:Name="TabControl" SelectedValue.Header="{Binding SelectedTab}"> 绑定到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="{}"绑定它。