Я надеюсь, что этот вопрос не был задан в другом месте, но мне трудно найти правильные условия поиска, чтобы найти какие-либо уже существующие ответы на эту проблему.
Я реализую программу на 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массивы данных и связанные с ними пользовательские классы).
Есть идеи?Я читал о пользовательской проверке, хотя пока не понимаю, как это может помочь в этом случае.