0

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; }
}
TheColonel26
  • 2,618
  • 7
  • 25
  • 50
  • How is the content of a TabItem related to the enum value? – mm8 Mar 19 '18 at 14:02
  • If you look at MV_Test Class at the bottom of my code you will see that for each test type there are different parameters. So for DCW I would display RampTime thru ArcDetectionCurrentLimit and for Resistance I would Display TestTimeResistance thru MaxResistance. I originally had each test in it's own class but because of the hardware's serial interface syntax I changed it to one class. – TheColonel26 Mar 19 '18 at 15:46
  • So an instance of a MV_Test corresponds to a TabItem in the view? – mm8 Mar 19 '18 at 16:08
  • No, The entire TabControl would loosely corresponded to 1 instance of MV_Test. Haven't gotten far enough to have multiple MV_Test instances yet. 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". – TheColonel26 Mar 19 '18 at 17:35

1 Answers1

0

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>
TheColonel26
  • 2,618
  • 7
  • 25
  • 50