none
Как в XAML при привязки правила проверки для значения в элементе управления, задать в качестве граничных значений не константы, а переменные? RRS feed

  • Вопрос

  • В WPF, при проверке значения, введённого с клавиатуры в экранный элемент (например TextBox), используется объект класса, производного от класса ValidationRule. Например:

    using System.Globalization;
    using System.Windows.Controls;
    
    namespace SDKSample
    {
        public class MarginValidationRule : ValidationRule
        {
            double minMargin;
            double maxMargin;
    
            public double MinMargin
            {
                get { return this.minMargin; }
                set { this.minMargin = value; }
            }
    
            public double MaxMargin
            {
                get { return this.maxMargin; }
                set { this.maxMargin = value; }
            }
    
            public override ValidationResult Validate(object value, CultureInfo cultureInfo)
            {
                double margin;
    
                // Is a number?
                if (!double.TryParse((string)value, out margin))
                {
                    return new ValidationResult(false, "Not a number.");
                }
    
                // Is in range?
                if ((margin < this.minMargin) || (margin > this.maxMargin))
                {
                    string msg = string.Format("Margin must be between {0} and {1}.", this.minMargin, this.maxMargin);
                    return new ValidationResult(false, msg);
                }
    
                // Number is valid
                return new ValidationResult(true, null);
            }
        }
    }

    Затем, в XAML, выполняется привязка правила проверки к элементу управления:

    <Window 
        . . . . . . . . . . . . . . 
        FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">
    
        . . . . . . . . . . . . . .
    
    <Label Grid.Column="0" Grid.Row="0">Left Margin:</Label>
    <TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0">
      <TextBox.Text>
        <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
          <Binding.ValidationRules>
            <local:MarginValidationRule MinMargin="0" MaxMargin="10" />
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
    
        . . . . . . . . . . . . . . . 
    
    </Window>

    Здесь - в XAML-разметке в качестве значений для MinMargin и MaxMargin заданы константы 0 и 10 соответственно. А вот как в XAML-разметке задать значения для MinMargin и MaxMargin не константами, а переменными, значения которых были определены в коде C#?

    Помогите, братцы.




    • Изменено TownSparrow 13 декабря 2012 г. 17:55
    13 декабря 2012 г. 15:37

Ответы

  • я имел в виду

    MaxMargin="Binding MaxMarginProp"
    тогда как бы не изменилось значение MaxMarginProp, вы всегда будете использовать актуальное значение

    • Помечено в качестве ответа TownSparrow 17 декабря 2012 г. 16:28
    14 декабря 2012 г. 7:36

Все ответы

  • а что мешает вам использовать биндинг переменных на константы?
    13 декабря 2012 г. 19:54
  • а что мешает вам использовать биндинг переменных на константы?

    Извиняюсь - не понял. Т.е. вы хотите сказать, что в качестве источника значения для переменных использовать константы? Или что? Для значения нижнего предела, т.е. MinMargin, я могу просто использовать константу "0" прямо в XAML, как и в примере, тут проблем нет. Всё дело в верхней границе MaxMargin. Там должна быт переменная, т.к. её значение может меняться. В начале сеанса работы с программой, пользователь вводит это значение (которое больше нуля и кратно 5) с клавиатуры. И в процессе работы с приложением, пользователь может время от времени менять его. И я не могу в коде предугодать это значение и предложить для него несколько констант.


    • Изменено TownSparrow 14 декабря 2012 г. 7:30
    14 декабря 2012 г. 7:30
  • я имел в виду

    MaxMargin="Binding MaxMarginProp"
    тогда как бы не изменилось значение MaxMarginProp, вы всегда будете использовать актуальное значение

    • Помечено в качестве ответа TownSparrow 17 декабря 2012 г. 16:28
    14 декабря 2012 г. 7:36
  • Привет.

    Посмотрите решение проблемы, которые приведено здесь - How to add a binding to a property on a ValidationRule, там же есть и ссылка на готовый проект. Суть там в хитрой привязке данных, но решение там не очень простое и прозрачное.

    Также вот еще одно решение данной проблемы - Fully binded validation by using Dependency and Attached properties


    Для связи [mail]

    17 декабря 2012 г. 8:18