所以这是我的问题。我在某个单元中测量了一些数据,我希望能够以数字向上/向下编辑它,具体取决于用户的首选物理单位。
以下是一些代码摘录:
public class Layout : ANotifyPropertyChanged
{
private double _width = 360;
/// <summary>
/// Layout width in layout unit (1/72 inch)
/// </summary>
public double Width
{
get { return this._width; }
set { this.AssignAndNotifyPropertyChanged(ref this._width, value); }
}
private double _height = 360;
/// <summary>
/// Layout height in layout unit (1/72 inch)
/// </summary>
public double Height
{
get { return this._height; }
set { this.AssignAndNotifyPropertyChanged(ref this._height, value);
}
}
在我的设置中,我有一个定义用户首选单元的枚举:
public enum PhysicalUnits
{
Inch,
Centimeter,
Millimeter
}
现在我使用MultiValueConverter,其行为如下:
public class LayoutToUserConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
PhysicalUnits unit = (PhysicalUnits)values[0];
double value = (double)values[1];
return UnitHelper.LayoutTo(unit, value);
}
public object[] ConvertBack(object v, Type[] targetTypes, object parameter, CultureInfo culture)
{
if (v == null)
return null;
double value = (double)v;
return new object[] { MySettings.Default.PreferredUnit, UnitHelper.ToLayout(MySettings.Default.PreferredUnit, value) };
}
}
在我的XAML中:
<mahapps:NumericUpDown local:SettingsGrid.Header="Width" Interval="0.1" StringFormat="F2">
<mahapps:NumericUpDown.Value>
<MultiBinding Converter="{StaticResource ResourceKey=CurrentLayoutToUser}">
<Binding Source="{x:Static local:MySettings.Default}" Path="PreferredUnit" />
<Binding Path="Model.Width" />
</MultiBinding>
</mahapps:NumericUpDown.Value>
</mahapps:NumericUpDown>
问题在于,当我在设置中更改我的值时,会调用ConvertBack,并且由于单位被更改,所以一切都变得疯狂。我以前的方法是使用常规的ValueConverter并在设置更改时使其无效,但我找不到一个漂亮的方法来做它。
希望你能帮助我。