как написать пользовательский параметр для объекта зависимости в wpf с использованием mvvm

#c# #wpf

#c# #wpf

Вопрос:

как написать пользовательский параметр для объекта зависимости в wpf с использованием mvvm?

В моей ViewModel у меня есть объект зависимости под названием Seasonalprop, который я использую для привязки к текстовому полю в XAML. Я хотел бы написать пользовательский параметр, чтобы он уведомлял пользователя, когда предоставленная строка ввода не может быть преобразована в double. Ошибка, которую я получаю, заключается в том, что значение является строкой и не может быть преобразовано в double.

 public double Seasonalprop
        {
            get { return (double)GetValue(SeasonalProperty); }
            set
            {
                try
                  {
                          Double.TryParse(value, out parsedouble);
                          SetValue(SeasonalProperty, value);

                  }
                  catch(Exception ex)
                  {
                          MessageBox.Show(" String Input cannot be converted to 
                          type double");
                  }

            }
        }
  

Ответ №1:

Я думаю, вы хотите написать пользовательский параметр, чтобы он уведомлял пользователя, если значение в текстовом поле недопустимо.

Взгляните на документы для проверки в WPF

Текстовое содержимое текстового поля в следующем примере привязано к свойству Age (типа int) привязывающего исходного объекта с именем ods. Привязка настроена на использование правила проверки с именем AgeRangeRule, так что, если пользователь вводит нечисловые символы или значение, которое меньше 21 или больше 130, рядом с текстовым полем появляется красный восклицательный знак, а при наведении курсора мыши на текстовое поле появляется всплывающая подсказка с сообщением об ошибке.

Комментарии:

1. Я хотел бы сделать что-то подобное, но просто чтобы убедиться, что пользователь предоставляет значение, которое может быть преобразовано в double.

2. Да, поэтому в вашем случае, если TryParse метод возвращает false, вы должны установить его как ошибку проверки. Для решения этих ситуаций не делаются исключения.

3. Вместо правила возрастного диапазона, как указано в примере, у вас было бы число с плавающей точкой / double в нем.

Ответ №2:

Я думаю, что вся ваша концепция пошла в неправильном направлении. Прежде всего, когда выражение привязки обновляет свойство зависимости, оно вызывает свой SetValue метод onwer, но не оболочку свойства clr. Таким образом, пользовательский установщик ничего не сделает для вас в этой ситуации. И, как ответил @peeyushsingh, у wpf есть проверка привязки для этого. Итак, что-то, что вам нужно, должно быть похоже:

         <TextBox Text="{Binding Seasonalprop, ValidatesOnExceptions=True}">
            <Validation.ErrorTemplate>
                <ControlTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Border BorderThickness="1" BorderBrush="Red" >
                            <AdornedElementPlaceholder/>
                        </Border>
                        <TextBlock Foreground="Red" Margin="2" Name="cc"
                                   Text="!  Not a double."/>
                    </StackPanel>
                </ControlTemplate>
            </Validation.ErrorTemplate>
        </TextBox>