我有三个文本块,其文本绑定到三个不同的属性。
<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
答案 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的答案也有效,直到我这样做之后才看到它。