пятница, 19 марта 2010 г.

Silverlight DataForm и стилизация генерируемых им компонентов

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;
        }
    } 
}


Newer Posts Older Posts