gpt4 book ai didi

c# - 将可见性绑定(bind)到静态属性

转载 作者:行者123 更新时间:2023-12-04 02:21:46 25 4
gpt4 key购买 nike

我有一个带有标签的控件,我想根据控件所有实例的全局菜单项隐藏或显示它。如果我单击按钮来隐藏标签,我想隐藏它们中的所有

我的 xaml 看起来像这样:

<TextBlock Name="_label" Visibility="{Binding LabelShown}" VerticalAlignment="Center" HorizontalAlignment="Center"/>

在我后面的代码中我有一个属性:

    private static Visibility _labelShown;
public static Visibility LabelShown
{
get { return _labelShown; }
set { _labelShown = value; }
}

我设置了DataContext = this;

当我更改静态属性时,没有任何反应。我认为这是因为没有控件收到属性更改通知。我无法在其上实现 INotifyPropertyChanged,因为我无法从我的静态属性中引用非静态属性更改处理程序。

我觉得这可能不是最好的方法,但我真的很想用一个按钮(在我实际控制之上的许多级别)驱动所有实例的可见性。

最佳答案

CodeNaked 的解决方案有效,但它使用单例,这在进行单元测试时有缺点。我更喜欢通过在应用程序根目录下设置一个实例来解决全局访问问题,即 App 类。

例如

public partial class App : Application
{
private static Settings _settings = new Settings();
public static Settings Settings
{
get { return _settings; }
}

...

此属性包含应用程序的所有设置。绑定(bind)看起来像这样:

"{Binding Source={x:Static local:App.Settings}, Path=LabelsShown}"

编辑:如果您担心依赖关系,您还可以使用最小接口(interface)在任何需要的类的构造函数中注入(inject)对这些设置的引用。

例如

public class MyControl : ContentControl
{
public interface IMyControlSettings
{
public bool LabelsShown { get; set; }
}

private IMyControlSettings _settings;

public MyControl(IMyControlSettings settings)
{
_settings = settings;
DataContext = _settings; // For easy binding, in most cases you probably do not want to do that since it prevents DataContext inheritance.
}
}
public class Settings : Test.MyControl.IMyControlSettings, INotifyPropertyChanged
{
public bool LabelsShown { get; set; }
...
}

关于c# - 将可见性绑定(bind)到静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5679722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com