2011-09-08 123 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'類型。 –