c # Изменить значение свойства перед привязкой - PullRequest
0 голосов
/ 07 июня 2018

Я не уверен, задавался ли этот вопрос раньше или нет, но в настоящее время я нахожусь в ситуации, когда я связываю свойство моего элемента управления с DependencyProperty. Однако значение, возвращаемое Property, имеет тип Double.При установке привязки, как вычесть 20 или заданное значение из свойства, а затем связать элемент управления?Мне нужно реализовать IValueConverter для этого?Я все еще изучаю WPF, поэтому любая помощь будет оценена.

Свойство зависимости

public static readonly DependencyProperty ProgressbarValueDependency = DependencyProperty.Register("PrValue", typeof(double),     typeof(LinearProgressBar));

public double PrValue
{
    get
    {
        return System.Convert.ToDouble(GetValue(ProgressbarValueDependency));
    }
    set
    {
        SetValue(ProgressbarValueDependency, value);
    }
}

Привязка к свойству

 {
MainGrid = GetTemplateChild("MainGrid");
Binding MainGridWidthBinding = new Binding("PrValue")
{
    Source = this,
    Mode = BindingMode.TwoWay
};
MainGrid.SetBinding(Grid.WidthProperty, MainGridWidthBinding);
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Лучший способ - внедрить IValueConverter, вот пример.

using System;
using System.Windows.Data;

namespace WpfApp1
{
    public class DoubleModifierConverter : IValueConverter
    {
        public double Modifier { get; set; }
        public Operator Operator { get; set; } = Operator.Addition;

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (!(value is double doubleValue))
                throw new InvalidCastException();

            switch (Operator)
            {
                case Operator.Addition:
                    return doubleValue + Modifier;
                case Operator.Substraction:
                    return doubleValue - Modifier;
                case Operator.Multiplication:
                    return doubleValue * Modifier;
                case Operator.Division:
                    return doubleValue / Modifier;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (!(value is double doubleValue))
                throw new InvalidCastException();

            switch (Operator)
            {
                case Operator.Addition:
                    return doubleValue - Modifier;
                case Operator.Substraction:
                    return doubleValue + Modifier;
                case Operator.Multiplication:
                    return doubleValue / Modifier;
                case Operator.Division:
                    return doubleValue * Modifier;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }

    public enum Operator
    {
        Addition = 0,
        Substraction = 1,
        Multiplication = 2,
        Division = 3,
    }
}

И вот как вы бы его использовали.

MainGrid = GetTemplateChild("MainGrid");
Binding MainGridWidthBinding = new Binding(nameof(PrValue)){
    Source = this,
    Mode = BindingMode.TwoWay,
    Converter = new DoubleModifierConverter 
    { 
        Modifier = 20.0, 
        Operator = Operator.Substraction 
    }
};
MainGrid.SetBinding(Grid.WidthProperty, MainGridWidthBinding);
0 голосов
/ 08 июня 2018

Для достижения вашей цели вам нужно написать класс, реализующий интерфейс IValueConverter.

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, string language)
    {
        // Contain your source to target convertion logic. 
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, string language)
    {
        // Contain your target to source convertion logic.
        // Only needed if using TwoWay or OneWayToSource Binding Mode. 
    }
}

Затем установите его экземпляр в свойство Binding.Converter перед вызовом SetBinding метода.

Binding MainGridWidthBinding = new Binding("PrValue")
{
    Source = this,
    Mode = BindingMode.TwoWay,
    Converter = new MyConverter(),
};
MainGrid.SetBinding(Grid.WidthProperty, MainGridWidthBinding);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...