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.
Binding to static class property [duplicate]
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}}" />
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 defined –
Pheidippides
@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 #41519886 –
Mint
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 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;
}
}
This helps me a lot, thanks! Any link to official document where is this described? –
Chant
This has worked for me:
Text="{Binding Source={x:Static MyNamespace:MyStaticClass.MyProperty}, Mode=OneWay}"
Without Mode=OneWay
I got an exception.
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
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}}"/>
© 2022 - 2024 — McMap. All rights reserved.