2010-10-21 2 views
0

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

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

+0

Вы не можете просто привязать фон TextBox к свойству на ViewModel, которое будет работать через конвертер и предоставить вам необходимый «цвет»? Игнорирование элемента проверки, потому что из того, что я собираю, визуальная концепция будет одинаковой для всех ... просто разными цветами. –

+0

@Aaron: Это действительно решит проблему не-обобщаемого стиля. Хм .. все равно потребовалось бы иметь по крайней мере два свойства в ViewModel для каждого поля в пользовательском интерфейсе: один для самих данных, а другой для свойства, указывающий, какой цвет отображает его как. Я бы предпочел просто иметь одно свойство для каждого поля, но если я должен использовать решение, которое я разместил, ваше предложение поможет. Благодаря! – skybluecodeflier

+0

@skybluecodeflier Посмотрите на это скорее как на определение состояния. Имея это в виду, у вас есть объект, который содержит строковое представление и откуда были получены данные, т. Е. ... TemplateValue. Этот тип объекта становится вашим свойством в ViewModel, к которому вы привязаны, таким образом, как единственное свойство, которое вы хотите, инкапсулируя соответствующие данные. –

ответ

0

Игнорируйте использование валидации IDataErrInfo все вместе, поскольку кажется, что вы действительно хотите сделать это 1 из 4 значений ... и «плохие» данные просто являются одним из них.

Вам нужно держать предметы на равномерном игровом поле, так как вы относитесь к ним одинаково, просто различая цвета. Используйте одно свойство с объектом, обертывающим значение и состояние модели в ViewModel. Игнорируйте IDataErroInfo, а затем используйте конвертер для обеспечения раскраски, а затем добавьте делегат в AdornerString, который будет настроен на функцию проверки, написанную в ViewModel для него.

 Смежные вопросы

  • Нет связанных вопросов^_^