绑定到 WPF 中静态类中的静态属性

Posted

技术标签:

【中文标题】绑定到 WPF 中静态类中的静态属性【英文标题】:Binding to static property in static class in WPF 【发布时间】:2014-01-29 16:12:21 【问题描述】:

我在从静态类的静态属性中绑定值时遇到问题。

我的班级:

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

当我运行此代码时,背景设置正常,但其余部分保持不变..

【问题讨论】:

【参考方案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 模式声明一个类,因此只能有一个实例,like static班级。只需在此类中使用普通的public CLR 属性...类似这样(但带有属性):

public class StateManager

    private static StateManager instance;
    
    private StateManager()  

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

    ...

然后仅使用 Instance 属性从基本视图模型中引用它,如下所示:

public StateManager StateManager

    get  return StateManager.Instance; 

然后你可以简单地访问 UI 中的属性,像这样::

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

【讨论】:

+1 这正是我正在寻找的——即在绑定中使用常规(非静态)类。为什么不需要在Binding 标记中指定"Source=... 如果您在 App.xaml 代码后面需要这个实例怎么办?需要在 OnStartup 事件中设置静态变量。 @LuckyLuke82,你可以在任何你喜欢的地方使用它。它只是一个类,将在第一次使用时初始化。

以上是关于绑定到 WPF 中静态类中的静态属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF 绑定到静态属性(4.5)

如何创建静态可绑定属性描述对象

2021-09-14 WPF上位机 12-属性绑定(静态属性绑定)

Xamarin XAML x:嵌套类中对属性的静态引用

es6中类中的静态属性实例属性静态方法实例方法的个人理解

为啥我不能在 .net 核心中将静态属性与通知绑定?