在命令中转换文本框中不断更新的单位

时间:2016-12-02 15:00:30

标签: c# wpf unit-conversion

我有三个文本块,其文本绑定到三个不同的属性。

<TextBlock Style="{StaticResource textBlockStyle2}"
           Text="{Binding Path=TWD,
                          Mode=TwoWay,
                          UpdateSourceTrigger=PropertyChanged},
                          StringFormat={}{0:F1} M}" />
<TextBlock Style="{StaticResource textBlockStyle2}"
           Text="{Binding Path=Alt,
                          Mode=TwoWay,
                          UpdateSourceTrigger=PropertyChanged},
                          StringFormat={}{0:F1} M}" />
<TextBlock Style="{StaticResource textBlockStyle2}"
           Text="{Binding Path=Dep,
                          Mode=TwoWay,
                          UpdateSourceTrigger=PropertyChanged},
                          StringFormat={}{0:F1} M}" />

这些是viewmodel中的属性:

private double _TWD;
public double TWD
{
    get { return _TWD; }
    set { _TWD = value; OnPropertyChanged("TWD"); }
}

private double _Alt;
public double Alt
{
    get { return _Alt; }
    set { _Alt = value; OnPropertyChanged("Alt"); }
}

private double _Dep;
public double Dep
{
    get { return _Dep; }
    set { _Dep = value; OnPropertyChanged("Dep"); }
}

现在,它们以米为单位,这是文本块的StringFormat属性中的'M'。我想要做的是,当我在一个单独的文本块上点击(通过命令)(这将使用控件模板在一个按钮内),我想将上面文本块中的值转换为英尺并添加价值后面的'F'。再次点击将其转换回米,依此类推。

我正在考虑添加一个仅根据bool isMeters转换值的命令。但是,文本块中的值会不断更新(每秒一次),并且我不希望每次值更改时都调用该函数。有没有更简单的方法我没想到要实现这个功能?

注意:

1 meter = 3.2808 ft
1ft = 0.3048 meter

1 个答案:

答案 0 :(得分:0)

我使用转换器工作了。

public class MetersToFeetConverter : IValueConverter
{
    /// <summary>
    /// Converts meters to feet.
    /// </summary>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        value = (double)value * 3.2808;
        return (value.ToString() + " F"); 
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

然后在viewmodel中:

private bool _isMeters = true;
public bool IsMeters
{
    get { return _isMeters; }
    set { _isMeters = value; OnPropertyChanged("IsMeters"); }
}

//called when I click the button to convert
public void ConvertData(object parameter)
{
    if (_isMeters == false)
    {
        IsMeters = true;
    }
    else
    {
        IsMeters = false;
    }
}

然后使用datatrigger:

,文本框的xaml绑定就像这样
<Style.Triggers>
    <DataTrigger Binding="{Binding IsMeters, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="False">
        <Setter Property="Text" Value="{Binding Path=TWD, Converter={StaticResource metersToFeetConverter}}" />
    </DataTrigger>
</Style.Triggers>

注意:@haindl的答案也有效,直到我这样做之后才看到它。