2016-04-27 130 views
-1

我在WPF中有一个GridControl(它来自DevExpress,但这不是真正的重点),我试图根据StaticResource来设置样式。WPF设置ViewModel中的样式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. --> 

...在C#代码...

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所以样式不适用于标题。

我在这里做错了什么?

+0

如果是我的话,我都致力于这个设计,我先试试给视图模型一个'Func键<对象,对象> FindResource {获得;组; }'属性,并让视图将其设置为'(resKey)=> FindResource(resKey);'然后viewmodel可以访问FrameworkElement对其自身上下文的了解,而不会让事情更加纠结。 –

回答

0

我的解决方案是在代码中设置样式,并以这种方式分配它们。并不完全回答这个问题作为我的帖子的“主题”指定的,但它为我做的伎俩:

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

你为什么不只是“fontWeight设置”属性绑定到的东西在模型或视图模型.....认为将保持MVVM模式

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