#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>