C#将全局静态字符串绑定到UWP Textblock

时间:2016-12-30 10:00:25

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

大家。

有没有人知道如何将全局静态字符串绑定到UWP Textblock,并且控制中的属性更改更新?

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

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

对此有任何解决方案吗?

感谢名单。

2 个答案:

答案 0 :(得分:1)

您无法以与WPF中相同的方式绑定到UWP中的静态属性。没有x:静态标记扩展可用。

你有一些选择:

如果元素的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”)。

答案 1 :(得分:0)

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

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