Надеюсь, что этот вопрос не задан нигде, но мне трудно найти правильные условия поиска, чтобы выявить уже существующие ответы на эту проблему.Beyond Data Validation Styling: Styling, основанный на других свойствах
Я реализую программу в 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 для каждого поля, введенного USER- один для самих данных и тому другой - тот же пользовательский класс, что и выше, минус строка. Однако это означает, что я не могу обобщить стиль, используемый для текстовых полей. Каждый 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>
, поскольку каждое поле UI имеет определенный пользовательский класс, связанный с ним.
Я бы предпочел не реализовывать этот способ, так как у меня есть, возможно, более 100 страниц экранов ввода, причем каждый экран имеет 1-12 TextBox
, игнорируя DataGrids, созданный в миксе (с массивами parellel данных и связанные с ними пользовательские классы).
Любые идеи? Я читал о пользовательской проверке, хотя я пока не вижу, как это может помочь в этом случае.
Вы не можете просто привязать фон TextBox к свойству на ViewModel, которое будет работать через конвертер и предоставить вам необходимый «цвет»? Игнорирование элемента проверки, потому что из того, что я собираю, визуальная концепция будет одинаковой для всех ... просто разными цветами. –
@Aaron: Это действительно решит проблему не-обобщаемого стиля. Хм .. все равно потребовалось бы иметь по крайней мере два свойства в ViewModel для каждого поля в пользовательском интерфейсе: один для самих данных, а другой для свойства, указывающий, какой цвет отображает его как. Я бы предпочел просто иметь одно свойство для каждого поля, но если я должен использовать решение, которое я разместил, ваше предложение поможет. Благодаря! – skybluecodeflier
@skybluecodeflier Посмотрите на это скорее как на определение состояния. Имея это в виду, у вас есть объект, который содержит строковое представление и откуда были получены данные, т. Е. ... TemplateValue. Этот тип объекта становится вашим свойством в ViewModel, к которому вы привязаны, таким образом, как единственное свойство, которое вы хотите, инкапсулируя соответствующие данные. –