为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕慕森 2021-07-20 16:12:24
我的 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 转换器,但运气不佳。有任何想法吗?
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

我不会在 XAML 中指定值,而是将 ItemsSource 绑定到枚举中的值数组:

代码:

public AvailableTabs[] AvailableTabs => Enum.GetValues(typeof(AvailableTabs Enum)).Cast<AvailableTabs>().ToArray();

XAML:

<TabControl Name="MyTabControl" SelectedIndex="{Binding SelectedTab}" ItemsSource="{Binding AvailableTabs}" />



查看完整回答
反对 回复 2021-07-31
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您只需要一个将值转换为索引的转换器。


public class TabConverter : IValueConverter

{

    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )

    {

        return (int)value;

    }


    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )

    {

        return (AvailableTabs)value;

    }

}


查看完整回答
反对 回复 2021-07-31
  • 2 回答
  • 0 关注
  • 532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信