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