В WPF внешний вид элемента управления выполняется комбинацией шаблонов, стилей и иногда селекторов стилей. Если вы хотите изменить внешний вид элемента управления на основе состояния некоторых данных (он может быть внутренним или внешним по отношению к элементу управления, это на самом деле не имеет значения), то вы можете привязать значения стилей к этим данным и при их изменении внешний вид изменений элемента управления (при условии, что существует механизм уведомления для передачи изменений). Вы также можете преобразовать значения данных с помощью типов, называемых преобразователями значений (IValueConverter).
В качестве простого примера мы можем изменить стиль текста текстового блока на основе значения данных, лежащих в основе:
// In a C# class
public class MyState : INotifyPropertyChanged
{
public bool IsEmphasized
{
get { return _isEmphasized; }
set
{
if (_isEmphasized == value)
{
return;
}
_isEmphasized = value;
OnPropertyChanged("IsEmphasized"); // This is how to notify that the data is updated
}
}
// A converter
public class BooleanToBoldConverter : IValueConverter
{
public Object ConvertTo(Object value)
{
if (value is bool)
{
if ((bool)value)
{
return FontWeights.Bold;
}
else
{
return FontWeights.Normal;
}
}
}
}
<TextBlock DataContext="{Binding Source={StaticResource myStateInstance}}"
FontWeight="{Binding IsEmphasized, Converter={StaticResource BooleanToBoldConverter}}" Text="Text" />
Хотя это простой пример и некоторые детали опущены, основная идея, которую необходимо понять, заключается в том, что мы можем управлять пользовательским интерфейсом от значений данных, привязанных к свойствам и стилям декларативным способом. Нам не нужно делать фактический рисунок.