2016-04-27 11 views
-1

Ich habe ein GridControl in WPF (es ist von DevExpress, aber das ist nicht wirklich der Punkt) und ich versuche, die Header basierend auf einem StaticResource stylen.WPF-Einstellung Stil StaticResource in ViewModel

Normalerweise, was ich tun könnte, ist

<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. --> 

..und die fein funktionieren würde.

Ich baue die Spalten jedoch dynamisch im ViewModel, also muss ich in der Lage sein, die ColumnHeaderContentStyle programmgesteuert zur Laufzeit festzulegen.

So hat die XAML ...

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

... und in der C# -Code ...

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

Ein wenig Forschung zeigte mir Application.Current.Resources["HeaderStyle"] zu verwenden, aber es gibt null und so wird der Stil nicht auf den Header angewendet.

Was mache ich hier falsch?

+0

Wenn es nach mir ginge, und ich war zu diesem Entwurf verpflichtet, würde ich versuchen, zuerst das Ansichtsmodell gibt ein 'Func Findresource {get; einstellen; } 'property, und setze die View auf' (resKey) => FindResource (resKey); 'Dann hat das Viewmodel Zugriff auf das Wissen des FrameworkElements über seinen eigenen Kontext, ohne dass die Dinge sich weiter verheddern als sie sind. –

Antwort

0

Meine Lösung war, die Stile auch im Code zu setzen und ihnen so zuzuweisen. Nicht genau die Frage beantworten, wie in dem „Betreff“ von meinem Posten angegeben, aber es hat den Trick für mich:

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" 
    }); 
0

Warum gehe ich nicht einfach bindet den ‚Fontweight‘ Property etwas im Modell oder Ansichtsmodell ..... dass das MVVM Muster hält

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