PUG
PUG

Reputation: 4472

Binding Label to a static string

I have made a Base Form which is inherited by most Forms in the application. Base form contains a Status Bar Control that displays user name which is internally a static string.

User can Switch User at any point in the application by pressing a button on status bar. At this point the user name in the status bar should also change, as if now it only changes in code and UI has no idea about the change. I have googled around and found that i need to bind the label with that static string by implementing a INotifyProperty Interface. I have implemented many example code without success.

Appreciate any help

Upvotes: 0

Views: 2255

Answers (4)

David  DV
David DV

Reputation: 674

I use Reactive Extensions for these things

For example if you have a Context class with a property UserName

you could do this

public static class Context
{
   public static Subject<string> UserChanged = new Subject<string>();

   private static string user;
   public static string User
   {
      get { return user; }
      set
      {
         if (user != value)
         {
            user = value;

            UserChanged.OnNext(user);
         }
      }
   }
}

And then on your forms just do

   Context.UserChanged.ObserveOn(SynchronizationContext.Current)
                      .Subscribe(user => label.Text = user);

The ObserveOn(SynchronizationContext.Current) makes it safe for cross thread operation calls

Upvotes: 0

YoryeNathan
YoryeNathan

Reputation: 14522

You must implement a class to notify prop changed and therefore the prop can not be static. Combine with a singleton pattern and you have yout solution.

public class Global : INotifyPropertyChanged
{
    private string _userName;

    public string UserName
    {
        get
        {
            return this._userName;
        }
        set
        {
            if (this._userName == value)
            {
                return;
            }

            this._userName = value;

            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("UserName"));
            }
        {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private Global() {}

    public static readonly Global Get = new Global();
}

Usage:

var currUserName = Global.Get.UserName;

Global.Get.PropertyChanged += (s, e) => Console.WriteLine(e.PropertyName);
Global.Get.UserName = "John";

And bind to Global.Get to property UserName.

Upvotes: 0

pylover
pylover

Reputation: 8065

use BindableAttribute for the property you want to bind a control to it.

[Bindable(true)]
public int Username {
   get {
       // Insert code here.
       return 0;
   }
   set {
      // Insert code here.
   }
}

Upvotes: 1

nouryan
nouryan

Reputation: 1

I would:

1- Add a timer to the base form to update the status bar. (the timer resolution is uo to your requirement).

the timer Tick handler would be something like this:

private void timerStatusUpdate_Tick(object sender, EventArgs e)
{
    toolStripStatusLabelMessage.Text = StatusMessage();
}

2 - Add a virtual StatusMessage method to your base class:

class BaseForm : Form
{
    .......

    public virtual string StatusMessage()
    {
        return "override me!";
    }
}

3- override StatusMessage in all your derived classes

class XXXForm : BaseForm
{
    ........

    public override string StatusMessage()
    {
        return "XXXForm status message";
    }
}

Upvotes: 0

Related Questions