Vra

Ek wil graag hê dat verskeie tekskassies moet reageer op veranderinge van 'n onderliggende string.So as ek die inhoud van die string sou verander, sal al daardie tekskassies ook hul inhoud verander.

Nou kan ek nie die String-tipe daarvoor gebruik nie, want dit is onveranderlik.So ek het met StringBuilder gegaan.Maar die Teks-eienskap van 'n TextBox-objek neem slegs String.

Is daar 'n maklike manier om die StringBuilder-objek te "bind" aan die Text-eienskap van 'n TextBox?

Baie dankie!

PS:Die TextBox is tans WPF.Maar ek kan dalk oorskakel na Windows Forms as gevolg van Mono.

Was dit nuttig?

Oplossing

Jy kan altyd 'n eiendom wat lucky die toString () van die StringBuilder terug te ontbloot. Die vorm kan dan bind aan hierdie eiendom.

private StringBuilder _myStringBuilder;

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

Ander wenke

Dit blyk dat my vorige antwoord nie baie goed geformuleer is nie, aangesien baie mense die punt wat ek maak, verkeerd verstaan ​​het, so ek sal weer probeer met inagneming van mense se kommentaar.

Net omdat 'n String-objek onveranderlik is, beteken dit nie dat 'n veranderlike van tipe String nie verander kan word nie.As 'n objek 'n eienskap van die tipe String het, sal die toewysing van 'n nuwe String-objek aan daardie eienskap veroorsaak dat die eienskap verander (in my oorspronklike antwoord het ek hierna verwys as die veranderlike wat muteer, sommige mense stem blykbaar nie saam met die gebruik van die term " muteer" in hierdie konteks).

Die WPF-databindingstelsel kan aan hierdie eiendom bind.As dit in kennis gestel word dat die eiendom deur INotifyPropertyChanged verander, dan sal dit die teiken van die binding opdateer, en sodoende baie tekskassies toelaat om aan dieselfde eiendom te bind en almal verander op 'n opdatering van die eiendom sonder om enige bykomende kode te vereis.

Daarom is dit nie nodig om StringBuilder as die ondersteuningswinkel vir die eiendom te gebruik nie.In plaas daarvan kan u 'n standaard String-eienskap gebruik en INotifyPropertyChanged implementeer.

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 kan hieraan bind en sal outomaties optel en veranderinge aangebring in die waarde van die eiendom.Nee, die String-voorwerp het nie gemuteer nie, maar die String-eienskap het gemuteer (of verander, as jy verkies).

Hier wat ek gebruik om te StringBuilder bind aan teksboks in WPF:

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


}

In ViewModel:

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

In XAML:

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

Natuurlik kan jy ander StringBuilder metodes blootstel as jy nodig het.

Jy kan erf die teks boks en ignoreer die eiendom teks te haal en skryf aan die string bouer.

Eenvoudig gestel, no. Teks eiendom neem slegs 'n String. Dus, wat die bron is, sal jy moet dit te omskep in 'n String.

Om jou in staat stel om maklik te stel dit net een maal baie teksbokse, kan jy 'n klas eiendom wat altyd sit al teksboks waardes het ...

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

Ek sou die StringBuilder in 'n persoonlike klas toe te draai met 'n Add metode, Text metode, en 'n OnChanged gebeurtenis.

Wire die Add metode sodanig dat wanneer dit genoem dit voeg die teks na die StringBuilder byvoorbeeld en brande die gebeurtenis. Dan wanneer die gebeurtenis vure, gebruik die Text metode om 'n ToString doen op die StringBuilder.

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

Jy kan die teks eiendom van 'n teksboks bind aan 'n string eiendom ... Die String voorwerp is onveranderlik, maar 'n veranderlike van tipe String is perfek wispelturig ...

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

Jy sal nodig om dit te draai in 'n voorwerp wat INotifyPropertyChanged implemente, egter.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top