web-dev-qa-db-fra.com

Reliaison à la propriété statique en classe statique dans WPF

J'ai un problème de valeurs contraignantes à partir de propriétés statiques de la classe statique.

Ma classe:

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

et quand j'exécute ce fond, l'arrière-plan est défini, mais le reste reste inchangé ..

18
user3182398

Le problème est que vos propriétés source sont d'un Color Type et les propriétés de destination sont Brush . Vous pouvez créer SolidColorBrush Utilisation de votre couleur comme si:

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

Vous n'avez pas besoin d'utiliser static propriétés ... Vous pouvez déclarer une classe à l'aide du modèle Singleton, il ne peut donc y avoir qu'une seule instance, juste comme A static classe. Il suffit d'utiliser des propriétés normales public CLR dans cette classe ... quelque chose comme ça (mais avec des propriétés):

public class StateManager : INotifyPropertyChanged
{
    private static StateManager instance;

    private StateManager() { }

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

    ...
}

Ensuite, ne faites que référence à partir d'un modèle de vue de base à l'aide de la propriété Instance comme ceci:

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

Ensuite, vous pouvez accéder aux propriétés de l'interface utilisateur simplement, comme ceci ::

<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}" ... />
8
Sheridan