Silverlight DataForm очень мощный компонент. С его помощью можно легко управлять данными. При этом в нашем распоряжении есть компонент для валидатции пользовательского ввода. При всем этом великолепии есть один недостаток - установить стиль генерируемого им компонента очень сложно. Но это с первого взгляда :).
Чтобы установить кастомные стили генерируемым компонентам, воспользуемся способом, которым Вы все наверняка пользовались (указав стиль командным кнопкам DataForm'ы).
Для начала необходимо создать компонент наследник DataForm и назвать его, например, CustomDataForm.
public class CustomDataForm : DataForm
{
}
Теперь необходимо создать DependencyProperty для всех компонентов, которые хотим закостомезировать. Напомню, что DependencyProperty необходимо использовать для того, чтобы работал Binding. Рекомендую воспользоваться Code Snippets. public class CustomDataForm : DataForm
{
public static readonly DependencyProperty TextBoxStyleProperty =
DependencyProperty.Register("TextBoxStyle", typeof (Style), typeof (CustomDataForm), new PropertyMetadata(null));
///
/// TextBox style
///
public Style TextBoxStyle
{
get { return (Style)GetValue(TextBoxStyleProperty); }
set { SetValue(TextBoxStyleProperty, value); }
}
}
Далее обработаем событие генерации интересующего контрола обернутого в компонент DataField.//////Extends by replacing es with es ///whenever applicable /// protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e) { //устанавливаем стили SetStyling(e.Field); //Пробросим событие дальше base.OnAutoGeneratingField(e); }
И собственно реализация метода SetStyling(DataField f)
private void SetStyling(DataField field)
{
if(field.Content is TextBox)
{
field.Content.Style = TextBoxStyle;
}
}
Как видите все очень просто и элегантно ;).
Понятно, что данный пример предоставляет стилизацию одного компонента, но таким же образом можно сделать и для всех компонентов.
Ниже представлен полный код.
public class CustomDataForm : DataForm
{
public static readonly DependencyProperty TextBoxStyleProperty =
DependencyProperty.Register("TextBoxStyle", typeof (Style), typeof (CustomDataForm), new PropertyMetadata(null));
///
/// TextBox style
///
public Style TextBoxStyle
{
get { return (Style)GetValue(TextBoxStyleProperty); }
set { SetValue(TextBoxStyleProperty, value); }
}
//
/// Extends by replacing es with es
/// whenever applicable
///
protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
{
//устанавливаем стили
SetStyling(e.Field);
//Пробросим событие дальше
base.OnAutoGeneratingField(e);
}
private void SetStyling(DataField field)
{
if(field.Content is TextBox)
{
field.Content.Style = TextBoxStyle;
}
}
}


