Привязка к статическому свойству в статическом классе в WPF

У меня проблема со значениями привязки из статических свойств из статического класса.

Мой класс:

namespace MyNamespace.Data
{
    public static class MySettings
    {
        public static Color BackgroundColor { get; set; }
        public static Color FontColor { get; set; }
    }
}

XAML:

<Page ...
       xmlns:colors="clr-namespace:MyNamespace.Data"
      ...>
 ...
<Button Grid.Column="0" Content="Text"
        Background="{Binding Source={x:Static s:MySettings.BackgroundColor}}"
        Foreground="{Binding Source={x:Static s:MySettings.FontColor}}"
        BorderBrush="{Binding Source={x:Static s:MySettings.FontColor}}"/>

и когда я запустил этот код, Background установлен в OK, но остальное останется без изменений.

Ответы

Ответ 1

Проблема заключается в том, что ваши исходные свойства имеют свойства Color и назначения назначения Brush. Вы можете создать SolidColorBrush, используя свой цвет следующим образом:

<Button Content="Text">
    <Button.Background>
        <SolidColorBrush Color="{Binding Source={x:Static s:MySettings.BackgroundColor}}"/>
    </Button.Background>
    <Button.Foreground>
        <SolidColorBrush Color="{Binding Source={x:Static s:MySettings.FontColor}}"/>
    </Button.Foreground>
    <Button.BorderBrush>
        <SolidColorBrush Color="{Binding Source={x:Static s:MySettings.FontColor}}"/>
    </Button.BorderBrush>
</Button>

Ответ 2

Вам не нужно использовать свойства static... вы можете объявить класс с помощью шаблона Singleton, поэтому может быть только один экземпляр, как класс static. Просто используйте обычные свойства public CLR в этом классе... что-то вроде этого (но со свойствами):

public class StateManager : INotifyPropertyChanged
{
    private static StateManager instance;

    private StateManager() { }

    public StateManager Instance
    {
        get { return instance ?? (instance = new StateManager()); }
    }

    ...
}

Затем ссылайтесь только на модель базового представления, используя свойство Instance, подобное этому:

public StateManager StateManager
{
    get { return StateManager.Instance; }
}

Затем вы можете получить доступ к свойствам в пользовательском интерфейсе просто так: this:

<Ribbon:RibbonCheckBox Grid.Row="1" Label="Audit fields" 
    IsChecked="{Binding StateManager.AreAuditFieldsVisible}" ... />
<Ribbon:RibbonCheckBox Grid.Row="2" Label="ISRCs on results" 
    IsChecked="{Binding StateManager.AreIsrcsVisibleOnSearchResults}" ... />