简体   繁体   中英

Bind Enum to TabControl Tab Headers and Selected Tab

I have an Enum that I want to bind to a Tab Control. Basically I want the Enum member names (Descriptions) to populate the tab headers and the selected Tab to set the Enum Value.

What I want to do is have the Selected tab, control the value of the Enum. So when I select Tab "DC Hipot" it sets the value of the enum to DCW, When I select the "Resistance" Tab it sets the value of the enum to LOWOHM. Then I want the reverse to be true, if the enum value changes then the corresponding tab is selected. So for example if the enum value changes to LOWOHM then the selected tab is changed to "Resistance".

I have read this thread Binding TabControl to an enum but it does not provide a complete solution. I do not see where any of this actually ties in to the Tab Control.

This is an example with radio buttons and an int of what I want to do with Tabs and an Enum. Simple WPF RadioButton Binding?

The Specific enum is MV_Main.SelectedTestStepForUI.vTestType.

Here is my MainWindows.xaml

<Window x:Class="Hipot_Sequence_Editor.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Hipot_Sequence_Editor"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        xmlns:local1="clr-namespace:Hipot_Sequence_Editor.UI_Converters"
        mc:Ignorable="d"
        Title="MainWindow" Height="677.538" Width="896.456">
    <Window.DataContext>
        <local:MV_Main></local:MV_Main>
    </Window.DataContext>
    <Window.Resources>
        <local1:DoubleStringConverter  x:Key="DoubleStringConverter" />
    </Window.Resources>
    <WrapPanel>
        <TabControl>
            <TabItem Header="Resistance">
                <WrapPanel>
                    <WrapPanel>
                        <Label Content="Resistance"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="0.000mO" Text="{Binding SelectedTestStepForUI.MaxResistance, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                    <WrapPanel>
                        <Label Content="Dwell Time"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="0000mS" Text="{Binding SelectedTestStepForUI.TestTimeResistance, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                </WrapPanel>
            </TabItem>
            <TabItem Header="DC Hipot">
                <WrapPanel>
                    <WrapPanel>
                        <Label Content="Voltage"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="0.000kV" Text="{Binding SelectedTestStepForUI.Voltage, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                    <WrapPanel>
                        <Label Content="Ramp Time"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="0000mS" Text="{Binding SelectedTestStepForUI.RampTime, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                    <WrapPanel>
                        <Label Content="Dwell Time"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="0000mS" Text="{Binding SelectedTestStepForUI.DwellTime, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                    <WrapPanel>
                        <Label Content="Max Leakage Current"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="00.000m\A" Text="{Binding SelectedTestStepForUI.MaxLeakageLimit, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                    <WrapPanel>
                        <Label Content="Max  Breakdown Current"></Label>
                        <xctk:MaskedTextBox Width="50" Mask="00.000m\A" Text="{Binding SelectedTestStepForUI.BreakDownLimit, Converter={StaticResource DoubleStringConverter}}"></xctk:MaskedTextBox>
                    </WrapPanel>
                </WrapPanel>
            </TabItem>
        </TabControl>
    </WrapPanel>
</Window>

Here is the Main View Model, MV_Main and it's dependencies

[AddINotifyPropertyChangedInterface]  //** Fodo
class MV_Main
{

    public MV_Test SelectedTestStepForUI { get; set; }

    public IEnumerable<TestType> TestTypes
    {
        get
        {
            return Enum.GetValues(typeof(TestType))
                .Cast<TestType>();
        }
    }


    public MV_Main()
    {          
        SelectedTestStepForUI = new MV_Test();
    }

}

public enum TestType
{
    [Description("AC Hipot")]
    ACW,
    [Description("DC Hipot")]
    DCW,
    [Description("Resistance")]
    LOWOHM
}

[AddINotifyPropertyChangedInterface] //** Fodo
public class MV_Test
{
    public TestType vTestType { get; set; }
    //** DCW Items
    public double RampTime { get; set; }
    public double DwellTime { get; set; }
    public double Voltage { get; set; }
    public double MaxLeakageLimit { get; set; }
    public double MinLeakageLimit { get; set; }
    public double BreakDownLimit { get; set; }
    public double ArcDetectionTimeLimit { get; set; }
    public double ArcDetectionCurrentLimit { get; set; }

    //** LOWOHM Items
    public double TestTimeResistance { get; set; }
    public double MinResistance { get; set; }
    public double MaxResistance { get; set; }
}

I finally found a solution which is to use a IValueConverter

Here is my converter code

public class EnumSelectedConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || parameter == null) return false;
        TestType vmType = (TestType) value;
        TestType viewType = (TestType) parameter;

        return vmType == viewType;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || parameter == null) return false;

        bool isSelected = (bool) value;
        if (!isSelected) return false;

        TestType vTestType = (TestType) parameter;

        return vTestType;
    }
}

Then in my XAML

<TabControl Height="101" Width="294">
    <TabItem Header="Resistance" IsSelected="{Binding SelectedTestStepForUI.vTestType, Converter={StaticResource EnumSelectedConverter}, ConverterParameter={x:Static local:TestType.LOWOHM}}">
    </TabItem>
    <TabItem Header="DC Hipot" IsSelected="{Binding SelectedTestStepForUI.vTestType, Converter={StaticResource EnumSelectedConverter}, ConverterParameter={x:Static local:TestType.DCW}}">
    </TabItem>
</TabControl>

Note: Make to to add it to the top of the XAML file also Like this

<Window.Resources>
    <local1:EnumSelectedConverter x:Key="EnumSelectedConverter" />
</Window.Resources>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM