WPF绑定转换器取决于设置

时间:2016-06-10 08:22:40

标签: c# wpf settings valueconverter

所以这是我的问题。我在某个单元中测量了一些数据,我希望能够以数字向上/向下编辑它,具体取决于用户的首选物理单位。

以下是一些代码摘录:

    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并在设置更改时使其无效,但我找不到一个漂亮的方法来做它。

希望你能帮助我。

0 个答案:

没有答案