【问题标题】:C# Binding global static string to UWP TextblockC# 将全局静态字符串绑定到 UWP 文本块
【发布时间】:2017-05-14 15:16:31
【问题描述】:

大家。

有谁知道如何将全局静态字符串绑定到 UWP 文本块,并控制属性更改更新?

我尝试了很多东西,比如:

Text="{Binding Path={local:AppSettings.StorageFolder}, Mode=OneWay}"
Text="{x:Bind Path=(local:AppSettings.StorageFolder), RelativeSource={RelativeSource Self}, Mode=OneWay}"

没有一个有效。总是会出现一些错误,例如: “不支持嵌套类型,并且 值不在预期范围内”

我已经设法将它绑定到我班级中的非静态值:

Text="{x:Bind viewModel.MyValue, Mode=OneWay}"

有什么解决办法吗?

谢谢。

【问题讨论】:

  • 我强烈建议你尽量去掉静态变量。
  • 拥有全局变量(例如应用程序设置)的最佳方式是什么,这些变量可以在每个页面上看到并且可以更改?
  • 没有一种特殊的“最佳”方式可以做到这一点,而使用全局/静态变量是最糟糕的方式。
  • 好的,你有什么建议?
  • 这在很大程度上取决于您的应用架构。至少,您可以将其设为 App 类的成员,然后使用 App.Current 访问 App 类(尽管它仍然是静态成员)。还有许多其他方法,例如依赖注入或设置服务和服务定位器。

标签: c# xaml uwp win-universal-app uwp-xaml


【解决方案1】:

您根本无法像在 WPF 中那样绑定到 UWP 中的静态属性。没有可用的 x:Static 标记扩展。

你有一些选择:

如果元素的 DataContext 是定义静态属性的类型的实例,您可以照常绑定到静态属性:

<TextBlock Text="{Binding MyStaticProperty}" />

public sealed partial class BlankPage1 : Page
{
    public BlankPage1()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }

    public static string MyStaticProperty { get { return "Static..."; } }
}

如果静态属性是在另一个类中定义的,最好的选择是将静态属性包装在非静态类中:

public sealed partial class BlankPage1 : Page
{
    public BlankPage1()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }

    public static string MyWrapperProperty { get { return MyStaticClass.MyStaticProperty; } }
}

public static class MyStaticClass
{
    public static string MyStaticProperty { get { return "Static..."; } }
}

如果您想要属性更改通知,那么绑定到静态属性根本没有意义,因为属性的源对象必须实现 INotifyPropertyChanged 接口才能刷新目标属性通过引发 PropertyChanged 事件动态地进行。

您仍然可以将静态属性包装在实现 INotifyPropertyChanged 接口的非静态视图模型中:

public class ViewModel : INotifyPropertyChanged
{
    public string MyNonStaticProperty
    {
        get { return MyStaticClass.MyStaticProperty; }
        set { MyStaticClass.MyStaticProperty = value; NotifyPropertyChanged(); }
    }

    //...
}

public static class MyStaticClass
{
    public static string MyStaticProperty { get; set; }
}

当您想刷新视图中的目标属性时,显然需要从视图模型类调用 NotifyPropertyChanged("MyNonStaticProperty")。

【讨论】:

  • 谢谢,通过非静态类更新静态解决了我的问题。
  • "如果您想要属性更改通知,那么绑定到静态属性根本没有意义,因为属性的源对象必须实现 INotifyPropertyChanged 接口才能刷新应删除通过引发 PropertyChanged 事件来动态定位属性”。这不再是真的了。
【解决方案2】:

目前在 UWP 中使用 x:Bind 时,结束属性(即在路径的末尾)必须是可变/非静态的。但是,您可以在此之前引用静态属性,例如 x:Bind local:MyClass.Singleton.NonstaticProperty。

在 x:Bind 属性路径末尾使用函数也可以解决此类挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多