WPF:将 TabControl SelectedIndex 绑定到视图模型的枚举属性

我的 ViewModel 上有一个枚举属性:


视图模型:


public MyViewModel {


    // Assume this is a DependancyProperty

    public AvailableTabs SelectedTab { get; set; } 


    // Other bound properties

    public string Property1 { get; set; }

    public string Property2 { get; set; }

    public string Property3 { get; set; }

}


public enum AvailableTabs {

    Tab1,

    Tab2,

    Tab3

}

我希望能够将 TabControl 的 SelectedIndex(或 SelectedItem)绑定到此属性,并使用转换器正确设置适当的选项卡。不幸的是,我有点卡住了。我知道我可以轻松地在我的模型中使用 SelectedIndex,但我想要重新排序选项卡而不破坏任何东西的灵活性。我给每个 TabItem 一个适用枚举值的 Tag 属性。


我的 XAML:


<TabControl Name="MyTabControl" SelectedIndex="{Binding SelectedTab, Converter={StaticResource SomeConverter}}">

    <TabItem Header="Tab 1" Tag="{x:Static local:AvailableTabs.Tab1}">

        <TextBlock Text="{Binding Property1}" />

    </TabItem>

    <TabItem Header="Tab 2" Tag="{x:Static local:AvailableTabs.Tab2}">

        <TextBlock Text="{Binding Property2}" />

    </TabItem>

    <TabItem Header="Tab 3" Tag="{x:Static local:AvailableTabs.Tab3}">

        <TextBlock Text="{Binding Property3}" />

    </TabItem>

</TabControl>

我的问题是我不知道如何将 TabControl 放入我的转换器中,所以我可以这样做:


// Set the SelectedIndex via the enum (Convert)

var selectedIndex = MyTabControl.Items.IndexOf(MyTabControl.Items.OfType<TabItem>().Single(t => (AvailableTabs) t.Tag == enumValue));


// Get the enum from the SelectedIndex (ConvertBack)

var enumValue = (AvailableTabs)((TabItem)MyTabControl.Items[selectedIndex]).Tag;

恐怕我多虑了。我尝试使用 MultiValue 转换器,但运气不佳。有任何想法吗?


慕慕森
浏览 534回答 2
2回答

繁星点点滴滴

我不会在 XAML 中指定值,而是将 ItemsSource 绑定到枚举中的值数组:代码:public&nbsp;AvailableTabs[]&nbsp;AvailableTabs&nbsp;=>&nbsp;Enum.GetValues(typeof(AvailableTabs&nbsp;Enum)).Cast<AvailableTabs>().ToArray();XAML:<TabControl&nbsp;Name="MyTabControl"&nbsp;SelectedIndex="{Binding&nbsp;SelectedTab}"&nbsp;ItemsSource="{Binding&nbsp;AvailableTabs}"&nbsp;/>

子衿沉夜

您只需要一个将值转换为索引的转换器。public class TabConverter : IValueConverter{&nbsp; &nbsp; public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return (int)value;&nbsp; &nbsp; }&nbsp; &nbsp; public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return (AvailableTabs)value;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP