2014-01-10 5 views
15

У меня проблема со значениями привязки из статических свойств из статического класса.Привязка к статическому свойству в статическом классе в 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}}"/> 

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

ответ

15

Проблема заключается в том, что ваши свойства источника имеют 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> 
6

Вам не нужно используйте свойства static ... вы можете объявить класс, используя шаблон Singleton, поэтому может быть только один экземпляр, только , как a 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; } 
} 

Тогда вы можете получить доступ к свойствам в интерфейсе просто, как это ::

<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}" ... /> 
+0

+1 Это именно то, что я искал - то есть с использованием обычного (нестатическим) класса привязки. Почему вам не нужно указывать '' Source = {... 'в разметке' Binding'? – Sabuncu

Смежные вопросы