gpt4 book ai didi

c# - 无法在 WPF 中使用 IMultiValueConverter 以允许公制或英制输入

转载 作者:行者123 更新时间:2023-11-30 12:53:01 26 4
gpt4 key购买 nike

我想创建一个 C# WPF 表单来收集设备的测量值,但一些用户坚持使用英尺和英寸进行测量,而其他(较年轻的)用户则使用公制进行所有操作。数据库以米为单位存储所有内容,我认为这是使用 IMultiValueConverter 的完美场所。

每个表单都有一个名为 UseImperialMeasurementsDependencyProperty,用于存储用户偏好,我将此值与实际值一起传递给 Convert 函数以米为单位测量。到目前为止的代码如下所示:

<Label>Length:</Label>
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource DistanceStringConverter}" Mode="TwoWay">
<Binding Path="Length" />
<Binding ElementName="ThisControl" Path="UseImperialMeasurements" />
</MultiBinding>
</TextBox.Text>
</TextBox>


public class DistanceStringConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values.Length != 2 || !(values[0] is Double) || !(values[1] is Boolean)) return "ERROR";

Double measurement = (Double)values[0]; // Always in meters
Boolean useImperial = (Boolean)values[1];
string unit;

if (useImperial == true)
{
double feet, inches;

inches = (measurement * 100) / 2.54;

feet = Math.Floor(inches / 12);
inches = inches % 12;

var replacements = new object[4];

replacements[0] = feet.ToString("#,0");
replacements[1] = "'";
replacements[2] = inches.ToString("0");
replacements[3] = "\"";

// Display like 12'4"
return string.Format("{0}{1}{2}{3}", replacements);
}
else
{
// Display like 5,987.97m
return string.Format("{0}{1}", measurement.ToString("#,0.##"), m);
}
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
// ToDo: Figure out if imperial or metric measurements are prefered...
}
}

这非常适合显示测量值,但是将它们作为公制或英制输入一直存在问题,因为我无法在 ConvertBack 中看到 UseImperialMeasurements 属性的绑定(bind)值 方法。因此,当没有指定单位时,我不仅无法猜测用户输入的是英尺还是米,而且我也无法知道要返回什么 bool 值,以便用户设置的首选项不会改变。

是否可以将 UseImperialMeasurements 的值传递给 ConvertBack 函数?

最佳答案

将 UseImperialMeasurements 值存储为应用程序设置(或您想要的任何位置,实际上,但用例有利于应用程序范围的用户设置)。您可以通过双击 Visual Studio 项目树中的“属性”项来实现。在那里,只需单击“设置”选项卡并将“UseImperialMeasurements”添加为 bool。 , 范围 User , 并设置一个默认值。

然后,在代码中的任何位置,使用 Properties.Settings.Default.UseImperialMeasurements 访问和更改值属性(property)。

如果您记得在关闭表单或应用程序之前调用 Properties.Settings.Default.Save(),设置将“固定”。

然后,在 XAML 中,您将使用此绑定(bind)访问设置:

{Binding Source={x:Static my:Settings.Default},Path=UseImperialMeasurements}

或者,忘记转换器。将此功能烘焙到 ViewModel 中,并将 UseImperialMeasurements 值存储为应用程序设置(或者您想要的任何地方,真的,但用例有利于用户设置)

public class BackingDataClass
{
public double LengthAlwaysMetric { get; set; }
}
public class BackingDataClassViewModel : INotifyPropertyChanged
{
public BackingDataClass Data { get; set; }
public double Length
{
get
{
if (Properties.Settings.Default.UseImperialMeasurements == true)
{
return ConvertToImperial(Data.LengthAlwaysMetric);
}
else
{
return _lengthAlwaysMetric;
}
}
set
{
if (Properties.Settings.Default.UseImperialMeasurements == true)
{
Data.LengthAlwaysMetric = ConvertToMetric(value);
}
else
{
Data.LengthAlwaysMetric = value;
}
PropertyChanged(this, new PropertyChangedEventArgs("Length"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

关于c# - 无法在 WPF 中使用 IMultiValueConverter 以允许公制或英制输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com