【问题标题】:Change Binding According to Value in UserInterface根据 UserInterface 中的值更改绑定
【发布时间】:2015-10-13 19:44:59
【问题描述】:

我正在为传感器实现一个接口。因此,我创建了一个类 TestSensor、一个 ViewModel MainViewModel 和 GUI 本身。

在 GUI 中,我有 ComboBox,它有几个可以显示的单元。标准单位是微应变,这也是读取数据的单位。 读入数据后,我设法将其转换为所需的其他单位。这些值保存在传感器对象本身中。

我现在的问题

我该怎么做才能让标签显示所选单位?这样当我将单位从 microStrain 更改为例如ton,它会将所有Label更新为存储在ton中的值?

我知道转换器,但肯定有其他方法,尤其是因为我有不止一种可能的转换!我对 XAML 和 C# 比较陌生,所以我真的希望有人能指出一个使这成为可能的解决方案。

这是代码:

类测试传感器

 class TestSensor : ModelBase
{
    double sensorDatauStrain;
    public double SensorDatauStrain
    {
        get { return sensorDatauStrain; }
        set
        {
            if (sensorDatauStrain != value)
            {
                sensorDatauStrain = value;
                this.OnPropertyChanged();
            }
        }
    }

    double sensorDatakNewton;
    public double SensorDatakNewton
    {
        get { return sensorDatakNewton; }
        set
        {
            if (sensorDatakNewton != value)
            {
                sensorDatakNewton = value;
                this.OnPropertyChanged();
            }
        }
    }

    double sensorDataTon;
    public double SensorDataTon
    {
        get { return sensorDataTon; }
        set
        {
            if (sensorDataTon != value)
            {
                sensorDataTon = value;
                this.OnPropertyChanged();
            }
        }
    }

    double sensorDatausTon;
    public double SensorDatausTon
    {
        get { return sensorDatausTon; }
        set
        {
            if (sensorDatausTon != value)
            {
                sensorDatausTon = value;
                this.OnPropertyChanged();
            }
        }
    }

    string sensorName;
    public string SensorName
    {
        get { return sensorName; }
        set
        {
            if (sensorName != value)
            {
                sensorName = value;
                this.OnPropertyChanged();
            }
        }
    }

    public TestSensor(string name, double ustrain)
    {
        this.SensorName = name;
        this.SensorDatauStrain = ustrain;
    }

    public void UpdateUnits(double emodule, double diameter)
    {
        SensorDatakNewton = (SensorDatauStrain * 1000000) / (emodule * diameter);
        SensorDataTon = 9.81 * SensorDatakNewton;
        SensorDatausTon = 1.1 * SensorDatausTon; 
    }
}

VM 中表示的传感器:

public MainViewViewModel()
    {
        Sensor11 = new TestSensor("Sensor 1.1", 0);
        Sensor12 = new TestSensor("Sensor 1.2", 0);
        Sensor21 = new TestSensor("Sensor 2.1", 0);
        Sensor22 = new TestSensor("Sensor 2.2", 0);
        Sensor31 = new TestSensor("Sensor 3.1", 0);
        Sensor32 = new TestSensor("Sensor 3.2", 0);
        Sensor41 = new TestSensor("Sensor 4.1", 0);
        Sensor42 = new TestSensor("Sensor 4.2", 0);
        SideFactors = new Factors(100, 210);
        LimitPos = 0;
        LimitNeg = 0;
    }

    //-----------------Chosen unit------------------
    Unit unit;
    public Unit Unit
    {
        get { return unit; }
        set
        {
            if (unit != value)
            {
                unit = value;
                this.OnPropertyChanged();
            }
        }

    }



    //----------------One of the Sensors------------------------------
    TestSensor sensor11;
    public TestSensor Sensor11
    {
        get { return sensor11; }
        set
        {
            if (sensor11 != value)
            {
                sensor11 = value;
                this.OnPropertyChanged();
                this.OnPropertyChanged("SubTotal1");
                this.OnPropertyChanged("Average");
            }
        }
    }

这是 XAML 代码:

标签:

<Label Grid.Column="0" Grid.Row="1" Margin="0,0,1,1" FontSize="8" Content="{Binding Sensor11.SensorDatauStrain, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />

组合框:

<ComboBox x:Name="comboBox" IsReadOnly="True" VerticalAlignment="Center" 
                                     ItemsSource="{Binding Source={data:EnumBindingSource {x:Type data:Unit}}}" SelectedItem="{Binding Unit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

这是 GUI 的样子:

on the top left corner you see sensor 1.1, then sensor 1.2 etc. this is the place where the value of the Sensor 1.1 should be visible IN the chosen unit

感谢您的帮助!

【问题讨论】:

    标签: c# wpf xaml mvvm data-binding


    【解决方案1】:

    你快到了。对于 Label,将 Content 绑定到 ComboBox 的 SelectedValue 属性,而不是将其绑定到 Sensor11

    例如:

    <Label Margin="86,48,0,0"
           HorizontalAlignment="Left"
           VerticalAlignment="Top"
           Content="{Binding SelectedValue,
                             ElementName=comboBox}" />
    <ComboBox x:Name="comboBox"
              Width="120"
              Margin="94,21,0,0"
              HorizontalAlignment="Left"
              VerticalAlignment="Top"
              SelectedIndex="0">
              <!-- ... --->
    </ComboBox>
    

    【讨论】:

    • 你的意思是 Content={x:Type data:Unit} ?这只是在显示“Namespace.Data.Unit”的标签中结束......我需要程序根据所选单位更改绑定表达式!
    • @Laurence 对不起。我写错了,因为我复制了错误的代码!我已经用一段正确的代码而不是混淆的词更新了我的答案。 :) 本质上,标签采用组合的选定值。
    • 现在我明白你的意思了,但有一个普遍的误解。我更新了信息……如果你能再检查一下就好了。
    • 我想我现在理解得更好了。您不想只显示组合中的字面意思,而是显示与该值类型对应的值。所以实际上,每次组合的选择更改时,您都需要更改绑定。我认为您可能需要使用 DataTrigger。 msdn.microsoft.com/en-us/library/… 今天晚些时候我会尝试发布一些工作代码。
    • 不客气。另一个帮助链接:wpf-tutorial.com/styles/trigger-datatrigger-event-trigger
    猜你喜欢
    • 2015-10-14
    • 2015-02-08
    • 2014-11-24
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2019-10-23
    相关资源
    最近更新 更多