Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

WPF Graph Axes: Change ScaleKind at runtime

Solved!
Go to solution

The following problem is very similar to this thread, but I'm looking for a solution that follows the MVVM pattern and doesn't change UI elements in the code-behind.

 

Scenario: I have a CheckBox element that, when checked, will change the value of a boolean called LogarithmicXAxis in the ViewModel. I want my Graph's x-axis ScaleKind property to respond by toggling between Linear and LogarithmBase2. So I wrote an IValueConverter class as follows:

 

class BooleanScalekindConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)value)
            return NationalInstruments.Controls.RangeScaleKind.LogarithmBase2;
        else
            return NationalInstruments.Controls.RangeScaleKind.Linear;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.Equals(NationalInstruments.Controls.RangeScaleKind.LogarithmBase2))
            return true;
        else
            return false;
    }
}

Then I bound the ScaleKind property to LogarithmicXAxis:

<ni:AxisDouble x:Name="xAxis" Orientation="Horizontal" Range="-10, 10, System.Double" ScaleKind="{Binding LogarithmicXAxis, Converter={StaticResource BooleanScalekindConverter}, UpdateSourceTrigger=PropertyChanged}" />

When I try to debug, I can see that the LogarithmicXAxis value is updating correctly (and a different part of my app responds to a change in that value). However, there must be something wrong with the way I'm binding, or possibly with my converter, because the converter methods never get called.

 

I am relatively new to WPF, Measurement Studio, and MVVM, so any suggestions would be greatly appreciated!

0 Kudos
Message 1 of 4
(5,056 Views)

khawesdo,

 

What version of Measurement Studio and Visual Studio are you using?

Kirk L. | Applications Engineer | National Instruments
0 Kudos
Message 2 of 4
(4,978 Views)

Measurement Studio 2013  (v. 13.0.0.242)

Visual Studio Ultimate 2012

0 Kudos
Message 3 of 4
(4,976 Views)
Solution
Accepted by topic author khawesdo

Hi, khawesdo

 

I think your binding is almost there. You should do this (I've pasted the entire XAML for context, making the relevant parts bold, pardon my nasty namespace name Smiley Wink):

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ni="http://schemas.ni.com/controls/2009/xaml/presentation"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="480" Width="640" >
    <Window.Resources>
        <local:BooleanScalekindConverter x:Key="BooleanToScaleKindConverter" />
    </Window.Resources>
    <Grid>        
        <ni:Graph HorizontalAlignment="Left" Height="200" Margin="0" VerticalAlignment="Top" Width="300">
            <ni:Graph.Axes>
                <ni:AxisDouble x:Name="xAxis" Orientation="Horizontal" Range="-10, 10, System.Double" ScaleKind="{Binding Value, Converter={StaticResource BooleanToScaleKindConverter}, ElementName=LogarithmicXAxis, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </ni:Graph.Axes>
        </ni:Graph>
        <ni:Switch x:Name="LogarithmicXAxis" Content="Switch" FalseContent="Off" HorizontalAlignment="Left" Height="23" TrueContent="On" VerticalAlignment="Top" Width="100" Margin="22,231,0,0" Value="False"/>
    </Grid>
</Window>

Here, I am binding specifically to the LogarithmicXAxis element's Value property. 

 

I hope that helps!

 

 

 

Daniel Dorroh
National Instruments
0 Kudos
Message 4 of 4
(4,939 Views)