user3182398
user3182398

Reputation: 223

Binding to static property in static class in WPF

I have a problem with binding values from static properties from static class.

My class:

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}}"/>

and when I run this code Background is set OK but the rest remains unchanged..

Upvotes: 20

Views: 26402

Answers (2)

Sheridan
Sheridan

Reputation: 69985

You don't need to use static properties... you can declare a class using the Singleton pattern, so there can only be one instance, just like a static class. Just use normal public CLR properties in this class... something like this (but with properties):

public class StateManager
{
    private static StateManager instance;
    
    private StateManager() { }

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

    ...
}

Then only reference it from a base view model using the Instance property like this:

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

Then you can access the properties in the UI simply, like 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}" ... />

Upvotes: 8

dkozl
dkozl

Reputation: 33384

Problem is that your source properties are of a Color type and destination properties are Brush. You can create SolidColorBrush using your color like so:

<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>

Upvotes: 20

Related Questions