Помимо проверки данных: стили, основанные на других свойствах
Я надеюсь, что этот вопрос не был задан в другом месте, но мне трудно найти правильные условия поиска, чтобы найти какие-либо уже существующие ответы на эту проблему.
Я реализую программу на C# WPF (MVVM) со многими экранами в стиле интервью, где пользователь вводит научные данные упорядоченным образом. Мы хотели бы иметь Textbox
и DataGrid
Изменение цвета переднего плана и фона на индивидуальной основе в зависимости от того, были ли данные в этом элементе управления введены пользователем, введены ли программой в качестве значения по умолчанию или это значение шаблона из другого файла, импортированного пользователем. Кроме того, мы бы хотели, чтобы пользовательский интерфейс отвечал на проверочные проверки из IDataErrorInfo, реализованные во ViewModel.
Таким образом, данные, отображаемые в TextBox, могут быть синим, если это шаблонное значение, зеленым, если программа используется по умолчанию, черным, если пользователь вводит данные, и красным, если IDataErrorInfo говорит, что это неверные данные.
Мой первоначальный ответ для реализации этого был создать пользовательский класс:
class AdornerString{
private string _myString;
private bool _isTemplate;
private bool _isDefault;
public string MyString{
get{
etc.
}
set{
etc.
}
}
// accessor properties and Constructors omitted for brevity
}
Тогда у меня есть все мои TextBox.Text
свойства в представлении связаны так:
<TextBox Text="{Binding Path=someAdornerString.MyString,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"/>
и применить стиль с DataTriggers, который отвечает на свойства someAdornerString, чтобы создать соответствующие цвета.
Однако IDataErrorInfo в ViewModel больше не проверяет TextBox. Почему это так, и есть ли лучший способ решить мою проблему? Я не могу проверить внутри класса AdornerString.
Возможный обходной путь, хотя и нежелательный:
Единственное другое решение, о котором я могу подумать, - это иметь два свойства в ViewModel для каждого поля, введенного пользователем, - одно для самих данных, а другое - тот же пользовательский класс, что и выше, за исключением строки. Однако это означает, что я не могу обобщить стиль, используемый для текстовых полей. У каждого TextBox должен быть свой стиль:
<TextBox.Style>
<Style TargetType="{x:Type TextBox}"
BasedOn="{StaticResource OtherStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=**instanceCustomClass**.IsDefault}"
Value="True">
<Setter Property="Foreground"
Value="Green" />
</DataTrigger>
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="Foreground"
Value="OrangeRed" />
</Trigger>
</Style.Triggers>
</Style>
поскольку каждое поле пользовательского интерфейса имеет определенный пользовательский класс, связанный с ним.
Я бы серьезно не хотел реализовывать этот способ, так как у меня возможно более 100 страниц экранов ввода, каждый экран имеет 1-12 TextBox
каждый, игнорируя DataGrids, брошенные в миксе (с массивами данных parellel и связанными с ними пользовательскими классами).
Есть идеи? Я читал о пользовательской проверке, хотя пока не понимаю, как это может помочь в этом случае.
1 ответ
Проигнорируйте использование проверки IDataErrInfo все вместе, поскольку кажется, что вы действительно хотите сделать это одним из 4 значений... и "плохие" данные просто оказываются одним из них.
Вы должны держать предметы на ровном игровом поле, поскольку вы относитесь к ним одинаково, просто различая цвета. Используйте одно свойство с объектом, обертывающим значение и состояние модели в ViewModel. Игнорируйте IDataErroInfo, а затем используйте конвертер для предоставления раскраски, а затем добавьте делегата в AdornerString, для которого будет установлена функция проверки, записанная в ViewModel.