Binding to static class property [duplicate]
Asked Answered
D

4

55

I want to bind a textblock text to a property of a static class. Whenever the property value of the static class changes, it should reflect to the textblock which is on the other window or custom control.

Detonate answered 5/10, 2010 at 9:42 Comment(0)
G
86

You can bind to ANY property on a static class using the x:Static markup extension but if thy do not implement any change tracking, it might cause errors on the refresh!

<TextBlock Text="{Binding Source={x:Static sys:Environment.MachineName}}" />
Giverin answered 5/10, 2010 at 10:35 Comment(5)
That is, the property setter needs to raise the PropertyChanged event, just like any bound properties, to refresh properly.Mint
you need to add "xmlns:sys="clr-namespace:System;assembly=mscorlib" to your <Window> tag in order to make the code snipplet work, otherwise the namespace "sys" is not definedPheidippides
@AlexPaven: When invoking the PropertyChanged event, what do we send as the sender parameter? null?Teleology
In general for a static property? Sure I guess null would be appropriate; see #41519886Mint
Even if static property notifications are implemented, Source+x:Static doesn't enable notifications, you have to use Path: <TextBlock Text="{Binding Path=(local:Foo.StaticBar)}"/>Easy
G
24

For those who use nested static classes to organize/seperate constants. If you need to Bind into nested static classes, It seems you need to use a plus (+) operator instead of the dot (.) operator to access the nested class:

{Binding Source={x:Static namespace:StaticClass+NestedStaticClasses.StaticVar}}

Example:

public static class StaticClass
    {
        public static class NestedStaticClasses
        {
            public static readonly int StaticVar= 0;

        }
    }
Grisaille answered 28/5, 2015 at 19:0 Comment(1)
This helps me a lot, thanks! Any link to official document where is this described?Chant
E
20

This has worked for me:

Text="{Binding Source={x:Static MyNamespace:MyStaticClass.MyProperty}, Mode=OneWay}"

Without Mode=OneWay I got an exception.

Eshelman answered 5/3, 2014 at 20:33 Comment(2)
This method technically works for me, with a strange error. When I use a snippet like this it says that my static class is not part of the namespace (which it is) which gives me xaml an "Invalid Markup" screen on the designer. The strange part is that when I run the program it does not error out. Not only that but the snippet that is showing the error is working perfect. any idea what may be causing this?Uprise
@Uprise No idea. Sorry. It's been a while since I dealt with this. But it could be simply some bug in the intellisense.Eshelman
F
-1

It worked for me!

When you have static class with static property like this

 namespace App.Classes
 {
     public static class AppData
     {
         private static ConfigModel _configModel;
         public static ConfigModel Configuration
         {
            get { return _configModel; }
            set { _configModel = value; }
         }
     }

     public class ConfigModel : INotifyPropertyChanged
     {
         public event PropertyChangedEventHandler PropertyChanged;

          private bool _text = true;
          public bool Text
          {
               get { return _text ; }
               set { 
                     _text = value; 
                     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Text"));
               }
          }
      }
}

You can bind it to xaml like this.

xmlns:c="clr-namespace:App.Classes"

<TextBlock Text="{Binding Path=Text, Source={x:Static c:AppData.Configuration}}"/>
Frumentaceous answered 6/4, 2020 at 5:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.