【问题标题】:How can I bind a xaml property to a static variable in another class?如何将 xaml 属性绑定到另一个类中的静态变量?
【发布时间】:2013-04-06 18:48:03
【问题描述】:

我有这个 xaml 文件,我在其中尝试将文本块背景绑定到另一个类中的静态变量,我该如何实现?

我知道这可能很愚蠢,但我刚从 Win-forms 搬走,感觉有点失落。

这就是我的意思:

<TextBlock Text="some text"
           TextWrapping="WrapWithOverflow"
           Background="{Binding Path=SomeVariable}" />

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    首先你不能绑定到variable。您只能从 XAML 绑定到 properties。 要绑定到静态属性,您可以通过这种方式进行(假设您想绑定TextBlockText 属性)-

    <TextBlock Text="{Binding Source={x:Static local:YourClassName.PropertyName}}"/>
    

    local 是你的类所在的命名空间,你需要像这样在上面的 xaml 文件中声明 -

    xmlns:local="clr-namespace:YourNameSpace"
    

    【讨论】:

    • 检查您的Output 窗口。那里可能有一些绑定问题日志。
    • 你把变量Property做成了吗?
    • 啊,它是一个转换器问题,它告诉我我不能将颜色分配给画笔,应该在普通 c# 代码中使用转换器,我们曾经做过类似这样的事情 textblock.BackGround = new SolidColorBrush(GivenColor );
    • 但仍然迷路,也不知道如何实现!
    • 从转换器返回画笔 - return new SolidColorBrush(value as Color)
    【解决方案2】:

    您实际上不能绑定到静态属性(INotifyPropertyChanged 仅对实例有意义),所以这应该足够了......

    {x:Static my:MyTestStaticClass.MyProperty}  
    

    或例如

    <TextBox Text="{x:Static my:MyTestStaticClass.MyProperty}" Width="500" Height="100" />  
    

    确保包含 namespace - 即在 XAML 中定义 my,如 xmlns:my="clr-namespace:MyNamespace"


    编辑:从代码绑定
    (这部分有一些混合的答案,所以我认为扩展是有意义的,把它放在一个地方)


    OneTime绑定:

    你可以只使用textBlock.Text = MyStaticClass.Left(注意你放置的位置,初始化后)

    TwoWay(或OneWayToSource)绑定:

    Binding binding = new Binding();
    //binding.Source = typeof(MyStaticClass);
    // System.InvalidOperationException: 'Binding.StaticSource cannot be set while using Binding.Source.'
    binding.Path = new PropertyPath(typeof(MyStaticClass).GetProperty(nameof(MyStaticClass.Left)));
    binding.Mode = BindingMode.TwoWay;
    binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    this.SetBinding(Window.LeftProperty, binding);
    

    ...当然,如果您从代码中设置绑定,请删除 XAML 中的任何绑定。

    OneWay(属性从源头变化):

    如果您需要在源属性更改时更新目标(即控件的属性,在本例中为 Window.Left),则静态类无法实现(根据我上面的评论,您需要实现INotifyPropertyChanged,因此您可以只使用包装类,实现INotifyPropertyChanged 并将其连接到您感兴趣的静态属性(假设您知道如何跟踪静态属性的更改,即这更像是一个从现在开始的“设计”问题,我建议重新设计并将其全部放在一个“非静态”类中)。

    【讨论】:

    • 这正是我想要的。谢谢。
    • @jbyrd 你想从静态属性绑定到控件,还是静态,还是两种方式?
    • @NSGaga - 从控件到静态属性。
    • 这应该是公认的答案,而不是@RohitVats 的答案
    【解决方案3】:

    您可以使用较新的x:Bind 来执行此操作,只需使用:

    <TextBlock Text="{x:Bind YourClassName.PropertyName}"/>
    

    【讨论】:

    • x:Bind在WPF中不可用,你说的是UWP
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2023-04-04
    • 1970-01-01
    • 2021-12-17
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多