2011-09-08 190 views
1

我试图使我的应用程序的配色方案动态化,以便可以在属性(希望来自数据库)中具有确定我的应用程序的配色方案的颜色值。通过在WPF中绑定来动态设置资源样式

我有一个Resources.xaml文件,我为应用程序设置了颜色和样式,然后在所有控件和窗口中使用它们。我想将资源文件中的SolidColorBrush的颜色绑定到ViewModel中的一个属性,以便该颜色可以根据当前的应用程序值进行更改。这是我到目前为止,但它不工作,所以我必须失去一些东西。

代码在Resources.xaml文件:

<SolidColorBrush x:Key="ApplicationMainBackgroundBrush" Color="{Binding Path=MainApplicationColor, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ApplicationArchitecture:ViewModelBase}, Mode=FindAncestor}, FallbackValue=CornflowerBlue}"/> 

代码在MainWindow.xaml文件:

<Grid Grid.Row="0" x:Name="gridControl" Background="{DynamicResource ApplicationMainBackgroundBrush}"> 

我MainWindow.xaml的DataContext的是一个叫ApplicationViewModel类,它继承ViewModelBase具有一个属性“MainApplicationColor”,返回字符串“Teal”以从该FallbackValue中更改该SolidColorBrush的颜色。我现在很难编码颜色,但这是我希望从未来获得数据库价值的地方。颜色目前没有变化,所以我假设我的绑定源存在错误,因为它显然不像我认为的那样工作。

感谢,

克拉拉

回答

1

这个问题似乎是你SolidColorBrush.Color酒店的Binding

  1. 有祖先类型应该是ApplicationArchitecture:MainWindowApplicationArchitecture:ViewModelBase

  2. 该路径应该包含DataContext

像这样....

<SolidColorBrush x:Key="ApplicationMainBackgroundBrush" 
        Color="{Binding Path=DataContext.MainApplicationColor, 
           RelativeSource={RelativeSource FindAncestor, 
            AncestorType={x:Type ApplicationArchitecture:MainWindow}, 
             Mode=FindAncestor}, 
              FallbackValue=CornflowerBlue}"/> 

让我知道,如果这有助于。

+0

我想尽可能使它成为通用/灵活的,这样我的所有应用程序都可以使用它(资源文件位于公共库中),所以我不想设置窗口, m当前用作AncestorType,因为它不会在同一应用程序中使用该样式的不同应用程序中的相同对象,甚至不同于同一个窗口/控件。有无论如何设置绑定到我的ViewModelBase中的一个属性,或者指定它在任何使用此样式的控件的当前ViewModel中查找绑定,以便它尽可能灵活?谢谢! – regartso

+0

实际绑定到MainWindow时不需要删除祖先级别,因为它不能有另一个MainWindow类型的祖先,实际上AncestorLevel的默认值已经是1,所以删除它什么都不做。 –

+0

@klarat,你可以用通用的'Window'替换'ApplicationArchitecture:MainWindow',假定任何一个应用程序的最终父母是'Window'类型。 –