Frage

würde ich mehrere Textfelder wie auf Änderungen eines zugrunde liegenden Zeichenfolge zu reagieren. Also, wenn ich den Inhalt der Zeichenfolge ändern war, alle diese Textfelder würden auch ihren Inhalt ändern.

Nun, ich kann nicht den String-Typen für die Verwendung als es unveränderlich ist. Also ging ich mit Stringbuilder. Aber die Text-Eigenschaft eines TextBox-Objekt nur nimmt String.

Gibt es eine einfache Möglichkeit, zu „binden“ das Stringbuilder-Objekt an die Text-Eigenschaft eines TextBox?

Vielen Dank!

PS: Das Textfeld ist derzeit WPF. Aber ich kann wegen der Mono zu Windows Forms wechseln.

War es hilfreich?

Lösung

Sie können immer eine Eigenschaft verfügbar machen, die Getter ist gibt die ToString () des Stringbuilder. Das Formular kann dann auf diese Eigenschaft binden.

private StringBuilder _myStringBuilder;

public string MyText
{
  get { return _myStringBuilder.ToString(); }
}

Andere Tipps

Es scheint, meine Antwort nicht sehr gut formuliert wurde, wie viele Menschen den Punkt falsch verstanden ich mache, so werde ich versuchen, wieder zu berücksichtigen Leute Kommentare.

Nur weil ein String-Objekt ist unveränderlich bedeutet nicht, dass eine Variable vom Typ String kann nicht geändert werden. Wenn ein Objekt eine Eigenschaft vom Typ String hat, dann diese Eigenschaft ein neues String-Objekt zuweisen Eigentum (in meiner ursprünglichen Antwort zu ändern verursacht, beziehen ich mich auf diesem als Variable mutierenden, anscheinend einige Leute nicht einverstanden mit der Verwendung des Begriffs " mutieren“in diesem Zusammenhang).

Das WPF Databinding-System kann auf diese Eigenschaft binden. Wenn es wird darüber informiert, dass die Eigenschaftsänderungen durch INotifyPropertyChanged, dann wird es das Ziel der Bindung aktualisieren, so dass viele Textfelder auf die gleiche Eigenschaft und alle Änderung an einem Update der Immobilie binden, ohne dass zusätzlichen Code erforderlich ist.

Es besteht daher keine Notwendigkeit, String als Sicherungsspeicher für die Eigenschaft zu verwenden. Stattdessen können Sie eine Standard-String-Eigenschaft verwenden und INotifyPropertyChanged implementieren.

public class MyClass : INotifyPropertyChanged
{
    private string myString;

    public string MyString
    {
        get
        { return myString; }
        set
        {
            myString = value;
            OnPropertyChanged("MyString");
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        { handler(this, new PropertyChangedEventArgs(propertyName)); }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

WPF diese binden kann und wird automatisch abholen und in dem Wert vorgenommenen Änderungen der Eigenschaft . Nein, das String-Objekt hat nicht mutiert, aber die Eigenschaft String hat mutiert (oder geändert werden, wenn Sie bevorzugen).

Hier ist, was ich verwende Stringbuilder TextBox in WPF zu binden:

public class BindableStringBuilder : INotifyPropertyChanged
{
    private readonly StringBuilder _builder = new StringBuilder();

    private EventHandler<EventArgs> TextChanged;

    public string Text
    {
        get { return _builder.ToString(); }
    }

    public int Count
    {
        get { return _builder.Length; }
    }

    public void Append(string text)
    {
        _builder.Append(text);
        if (TextChanged != null)
            TextChanged(this, null);
        RaisePropertyChanged(() => Text);
    }

    public void AppendLine(string text)
    {
        _builder.AppendLine(text);
        if (TextChanged != null)
            TextChanged(this, null);
        RaisePropertyChanged(() => Text);
    }

    public void Clear()
    {
        _builder.Clear();
        if (TextChanged != null)
            TextChanged(this, null);
        RaisePropertyChanged(() => Text);
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
    {
        if (propertyExpression == null)
        {
            return;
        }

        var handler = PropertyChanged;

        if (handler != null)
        {
            var body = propertyExpression.Body as MemberExpression;
            if (body != null)
                handler(this, new PropertyChangedEventArgs(body.Member.Name));
        }
    }

    #endregion


}

Ansichtsmodell:

public BindableStringBuilder ErrorMessages { get; set; }
ErrorMessages.AppendLine("Missing Image: " + imagePath);

In XAML:

<TextBox Text="{Binding ErrorMessages.Text, Mode=OneWay}"/>

Natürlich können Sie andere Methoden String aussetzen, wenn Sie benötigen.

Sie können das Textfeld erben und die Text-Eigenschaft überschreiben, um den String-Builder abzurufen und zu schreiben.

Einfach gesagt, nein. Text-Eigenschaft nimmt nur einen String. Also unabhängig von der Quelle, werden Sie es in einen String konvertieren.

Damit Sie leicht für viele Textfelder einmal setzen, können Sie eine Klasse Eigenschaft haben, dass alle Textbox Werte immer setzt ...

public string MyString
{
  get
  {
   ///... 
  }
  set 
  {
    textbox1.Text = value;
    textbox2.Text = value;
    //...
  }
}

Ich würde die StringBuilder in einer benutzerdefinierten Klasse mit einer Add Methode, Text Verfahren wickelt und ein OnChanged Ereignis.

verdrahten die Add Methode, so dass, wenn es aufgerufen wird es den Text in die StringBuilder Instanz hinzufügt und löst das Ereignis. Dann, wenn das Ereignis ausgelöst wird, verwenden Sie die Text Methode eine ToString auf dem StringBuilder zu tun.

public class StringBuilderWrapper
{
   private StringBuilder _builder = new StringBuilder();
   private EventHandler<EventArgs> TextChanged;
   public void Add(string text)
   {
     _builder.Append(text);
     if (TextChanged != null)
       TextChanged(this, null);
   }
   public string Text
   {
     get { return _builder.ToString(); }
   }
}

Sie können die Text-Eigenschaft eines TextBox an eine String-Eigenschaft binden ... Das String-Objekt ist unveränderlich, sondern eine Variable vom Typ String ist perfekt wandelbar ...

string mutable = "I can be changed";
mutable = "see?";

Sie müssen sie wickeln in einem Objekt auf der INotifyPropertyChanged implementiert, aber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top