2012-03-27 2 views
0

Ich habe eine Basisform erstellt, die von den meisten Formularen in der Anwendung übernommen wird. Das Basisformular enthält ein Statusleisten-Steuerelement, das den Benutzernamen anzeigt, der intern eine statische Zeichenfolge ist.

Benutzer können Switch User an einem beliebigen Punkt in der Anwendung durch Drücken einer Schaltfläche in der Statusleiste. An dieser Stelle sollte sich auch der Benutzername in der Statusleiste ändern, so als ob er sich jetzt nur im Code ändert und UI keine Ahnung von der Änderung hat. Ich habe gegoogled und festgestellt, dass ich das Etikett mit dieser statischen Zeichenfolge binden muss, indem ich eine INotifyProperty-Schnittstelle implementiere. Ich habe viele Beispiel-Code ohne Erfolg implementiert.Binding Label zu einer statischen Zeichenfolge

Jede mögliche Hilfe schätzen

Antwort

0

Sie müssen eine Klasse implementieren prop zu benachrichtigen, geändert und daher kann die Stütze nicht statisch sein. Kombinieren Sie mit einem Singleton-Muster und Sie haben Ihre Lösung.

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(); 
} 

Verbrauch:

var currUserName = Global.Get.UserName; 

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

und binden an Eigenschaft Username Global.Get.

0

Ich würde:

1- einen Timer auf die Grundform Fügen Sie die Statusleiste zu aktualisieren. (die Timerauflösung ist uo zu Ihrer Anforderung).

der Timer Tick-Handler würde wie folgt sein:

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

2 - Fügen Sie eine virtuelle Methode Statusmessage auf Ihre Basisklasse:

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

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

3- Überschreibung in Statusmessage alle abgeleiteten Klassen

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

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

Verwenden Sie BindableAttribute für die Eigenschaft, an die Sie ein Steuerelement binden möchten .

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

Ich benutze Reactive Extensions für diese Dinge

Zum Beispiel, wenn Sie einen Context-Klasse mit einer Eigenschaft Username haben

Sie dieses

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); 
     } 
     } 
    } 
} 

tun konnte Und dann auf Ihre Formulare tun Sie einfach

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

Das ObserveOn (SynchronizationContext.Current) macht es sicher für Cross-Thread-Betrieb Anrufe

+0

Was ist das OnNext? – MonsterMMORPG