Динамическая установка стилей ресурсов посредством привязки в WPF

Я пытаюсь сделать цветовую схему моего приложения динамической, чтобы иметь значение цвета в свойстве (надеюсь, исходящем из базы данных), которое определяет цветовую схему моего приложения.

У меня есть файл Resources.xaml, в котором я задаю цвета и стили для приложения, которые затем использую во всех своих элементах управления и окнах. Я хотел бы привязать цвет SolidColorBrush в файле ресурсов к свойству в моих моделях представления, чтобы этот цвет мог изменяться в зависимости от текущего значения приложения. Вот то, что у меня есть до сих пор, но оно не работает, поэтому я должен что-то упустить.

Код в файле 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}">

DataContext моего MainWindow.xaml — это класс с именем ApplicationViewModel, который наследуется от ViewModelBase, у которого есть свойство «MainApplicationColor», возвращающее строку «Teal», чтобы изменить цвет этой SolidColorBrush из ее FallbackValue. Сейчас я жестко кодирую цвет, но именно здесь я хотел бы получить свое значение из базы данных в будущем. В настоящее время цвет не меняется, поэтому я предполагаю, что в моем источнике привязки что-то не так, поскольку он явно не работает, как я думаю, должен.

Спасибо,

Клара


person regartso    schedule 08.09.2011    source источник


Ответы (1)


Проблема, похоже, в Binding вашей собственности SolidColorBrush.Color.

  1. Там тип предка должен быть ApplicationArchitecture:MainWindow, а не ApplicationArchitecture:ViewModelBase.

  2. Путь должен включать в себя DataContext.

Как это....

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

Позвольте мне знать, если это помогает.

person WPF-it    schedule 08.09.2011
comment
Я пытаюсь сделать это как можно более универсальным/гибким, чтобы все мои приложения могли использовать это (файл ресурсов находится в общей библиотеке), поэтому я не хочу устанавливать окно, которое я сейчас использую как AncestorType, потому что это не будет тот же объект в другом приложении или даже другое окно/элемент управления в том же приложении, которое использует стиль. Можно ли в любом случае установить привязку к свойству в моей ViewModelBase или указать, что она ищет привязку в текущей ViewModel любого элемента управления, использующего этот стиль, чтобы он был максимально гибким? Благодарность! - person regartso; 08.09.2011
comment
Вам не нужно удалять уровень предка при фактической привязке к MainWindow, поскольку у него не может быть другого предка типа MainWindow, фактически значение по умолчанию для AncestorLevel уже равно 1, поэтому его удаление ничего не делает. - person H.B.; 08.09.2011
comment
@klarat, вы можете заменить ApplicationArchitecture:MainWindow на общий Window, предполагая, что конечным родителем любого из ваших приложений является тип Window. - person WPF-it; 08.09.2011
comment
@AngelWPF: это не совсем правильно, вы также можете иметь приложения WPF, размещенные в браузере ... - person H.B.; 08.09.2011
comment
спасибо, это сработало! Я установил для AncestorType значение Window, а затем критически важно, чтобы путь указывал на DataContext.MainApplicationColor, как предложил @AngelWPF, чтобы он выбрал его из модели представления привязки. еще раз спасибо. - person regartso; 09.09.2011