如何以编程方式绑定到静态属性?

时间:2012-11-25 09:29:40

标签: c# .net wpf xaml data-binding

如何以编程方式绑定到静态属性?我可以在C#中使用什么来制作

{Binding Source={x:Static local:MyClass.StaticProperty}}

更新:是否可以进行OneWayToSource绑定?我知道TwoWay是不可能的,因为静态对象上没有更新事件(至少在.NET 4中)。我无法实例化对象,因为它是静态的。

2 个答案:

答案 0 :(得分:8)

OneWay绑定

我们假设您的班级Country具有静态属性Name

public class Country
{
  public static string Name { get; set; }
}

现在您希望将Name绑定到TextProperty的{​​{1}}。

TextBlock

更新:双向绑定

Binding binding = new Binding(); binding.Source = Country.Name; this.tbCountry.SetBinding(TextBlock.TextProperty, binding); 课程如下所示:

Country

现在我们想要将此属性public static class Country { private static string _name; public static string Name { get { return _name; } set { _name = value; Console.WriteLine(value); /* test */ } } } 绑定到Name,所以:

TextBox

如果您想要更新目标,则必须使用Binding binding = new Binding(); binding.Source = typeof(Country); binding.Path = new PropertyPath(typeof(Country).GetProperty("Name")); binding.Mode = BindingMode.TwoWay; binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; this.tbCountry.SetBinding(TextBox.TextProperty, binding); 并运行BindingExpression

UpdateTarget

答案 1 :(得分:0)

您总是可以编写一个非静态类来提供对静态类的访问。

静态类:

namespace SO.Weston.WpfStaticPropertyBinding
{
    public static class TheStaticClass
    {
        public static string TheStaticProperty { get; set; }
    }
}

非静态类,提供对静态属性的访问。

namespace SO.Weston.WpfStaticPropertyBinding
{
    public sealed class StaticAccessClass
    {
        public string TheStaticProperty
        {
            get { return TheStaticClass.TheStaticProperty; }
        }
    }
}

绑定很简单:

<Window x:Class="SO.Weston.WpfStaticPropertyBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SO.Weston.WpfStaticPropertyBinding"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:StaticAccessClass x:Key="StaticAccessClassRes"/>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Path=TheStaticProperty, Source={StaticResource ResourceKey=StaticAccessClassRes}}" />
    </Grid>
</Window>