Настройка WPF Style StaticResource в ViewModel

У меня есть GridControl в WPF (это от DevExpress, но это не совсем так), и я пытаюсь стилизовать заголовки на основе StaticResource.

Обычно то, что я мог сделать, это

<UserControl.Resources>
    <Style x:Key="HeaderStyle" TargetType="dxg:HeaderContentControl">
        <Setter Property="FontWeight" Value="Bold" />
    </Style>
</UserControl.Resources>

<dxg:GridControl x:Name="MyParameters" ItemsSource="{Binding ParamRows}">
    <dxg:GridColumn ColumnHeaderContentStyle="{StaticResource HeaderStyle}" x:Name="ParamName" FieldName="ParamName" Width="80" Header="Parameter" />
    <dxg:GridColumn ColumnHeaderContentStyle="{StaticResource HeaderStyle}" x:Name="ParamValue" Binding="{Binding ParamValue}" Width="50"  Header="Value" />
<!-- etc.  -->

..и это будет работать нормально.

Однако я создаю столбцы динамически в ViewModel, поэтому мне нужно иметь возможность программно устанавливать ColumnHeaderContentStyle во время выполнения.

Итак, XAML имеет...

<dxg:GridControl x:Name="Parameters" ItemsSource="{Binding ParamRows}" ColumnsSource="{Binding ParamColumns}">
    <!-- no list of rows.  -->

... и в коде С#...

ParamColumns.Add(new GridColumn
{
    ColumnHeaderContentStyle = (Style)Application.Current.Resources["HeaderStyle"],
    FieldName = "ParamName",
    Width=80,
    Header="Parameter"
});


ParamColumns.Add(new GridColumn
{
    ColumnHeaderContentStyle = (Style)Application.Current.Resources["HeaderStyle"],
    Binding = new Binding("ParamValue"),
    Width=50,
    Header="Value"
});

Небольшое исследование указало мне на использование Application.Current.Resources["HeaderStyle"], однако оно возвращает null, поэтому стиль не применяется к заголовку.

Что я здесь делаю неправильно?


person colmde    schedule 27.04.2016    source источник
comment
Если бы это был я, и я был привержен этому дизайну, я бы сначала попытался дать модели представления свойство Func<Object, Object> FindResource { get; set; } и установить для него значение (resKey) => FindResource(resKey);. Тогда модель представления имеет доступ к знанию FrameworkElement своего собственного контекста, не получая ничего более запутанными, чем они.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 27.04.2016


Ответы (2)


Мое решение состояло в том, чтобы установить стили в коде и назначить их таким образом. Не совсем отвечает на вопрос, указанный в «Теме» моего сообщения, но это помогло мне:

private Style _headerStyle;

// etc. etc. 
public SetColumns
{
    _headerStyle = new Style(typeof(HeaderContentControl));
    _headerStyle.Setters.Add(new Setter(Control.FontWeightProperty, FontWeights.Bold));

    ParamColumns.Add(new GridColumn
    {
        ColumnHeaderContentStyle = _headerStyle,
        FieldName = "ParamName",
        Width=80,
        Header="Parameter"
    });


    ParamColumns.Add(new GridColumn
    {
        ColumnHeaderContentStyle = _headerStyle,
        FieldName = "ParamValue",
        Width=50,
        Header="Value"
    });
person colmde    schedule 27.04.2016

Почему бы вам просто не привязать свойство «FontWeight» к чему-то в модели или модели представления… что будет поддерживать шаблон MVVM

<UserControl.Resources>
    <Style x:Key="HeaderStyle" TargetType="dxg:HeaderContentControl">
        <Setter Property="FontWeight" Value="{Binding FontWeightProp}" />
    </Style>
</UserControl.Resources>
person Monty    schedule 27.04.2016