سؤال

وأود عدة مربعات النص للرد على التغيرات في سلسلة الأساسية. حتى لو كنت لتغيير محتوى السلسلة، فإن كل تلك مربعات النص تغيير مضمونها أيضا.

والآن، وأنا لا يمكن استخدام نوع سلسلة لذلك كما هو غير قابل للتغيير. فذهبت مع ب StringBuilder. ولكن الخاصية Text لكائن مربع نص يستغرق سوى سلسلة.

هل هناك طريقة سهلة ل"مأزق" الكائن ب StringBuilder إلى الخاصية Text لمربع نص؟

وشكرا جزيلا!

وPS: مربع نص هو حاليا WPF. ولكن أود أن التحول إلى أشكال ويندوز بسبب مونو.

هل كانت مفيدة؟

المحلول

هل يمكن أن يعرض دائما خاصية هذا جالبة إرجاع ToString () من ب StringBuilder. يمكن للشكل ثم ربط هذه الخاصية.

private StringBuilder _myStringBuilder;

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

نصائح أخرى

ويبدو كان جوابي السابقة لا صيغت بشكل جيد للغاية، كما فهمها كثير من الناس وجهة لقد جعل، لذلك سأحاول مرة أخرى مع الأخذ بعين تعليقات الناس الحساب.

ولأن مجرد كائن سلسلة غير قابل للتغيير لا يعني أن متغير من نوع سلسلة لا يمكن تغييرها. إذا كان كائن له خاصية من نوع سلسلة، ثم تعيين كائن سلسلة جديدة لتلك الممتلكات يسبب الملكية لتغيير (في جوابي الأصلي، أشرت إلى أن هذا هو تحور المتغير، على ما يبدو بعض الناس لا يتفقون مع استخدام مصطلح " يتحور "في هذا السياق).

وهذا النظام ربط البيانات WPF يمكن ربط هذه الخاصية. إذا تم إخطار أن التغييرات الممتلكات من خلال INotifyPropertyChanged، فإنه سيتم تحديث الهدف من الربط، مما يسمح لكثير من مربعات النص لربط لنفس الممتلكات، وجميع التغيير على تحديثا للممتلكات دون الحاجة إلى أي تعليمات برمجية إضافية.

لذلك، ليست هناك حاجة لاستخدام ب StringBuilder كمخزن دعم لخاصية. بدلا من ذلك، يمكنك استخدام خاصية سلسلة القياسية وتنفيذ INotifyPropertyChanged.

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 يمكن ربط هذا وسوف يختار تلقائيا والتغييرات التي أدخلت على قيمة <م> الملكية . لا، لم يتحول الكائن سلسلة، لكن الخاصية سلسلة <م> قد تحور (أو تغييرها، إذا كنت تفضل ذلك).

وهنا ما يمكنني استخدامها لربط ب StringBuilder إلى مربع نص في برنامج الأغذية العالمي:

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


}

في ViewModel:

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

في XAML:

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

وبالطبع يمكنك فضح أساليب ب StringBuilder أخرى إذا كنت بحاجة.

هل يمكن أن يرث مربع النص وتجاوز الخاصية Text لاسترداد والكتابة إلى بناء سلسلة.

وببساطة، لا. خاصية النص يستغرق سوى سلسلة. وبغض النظر عن المصدر، سيكون لديك لتحويلها إلى سلسلة.

لتمكين لك بسهولة تعيينها مرة واحدة لكثير من مربعات النص، هل يمكن أن يكون ملكية من الدرجة التي تضع دائما كل القيم النص ...

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

وأود أن التفاف StringBuilder في فئة مخصصة مع طريقة Add، طريقة Text، وحدث OnChanged.

وسلك حتى طريقة Add بحيث عندما يتم استدعاء فإنه يضيف النص إلى مثيل StringBuilder ووقع الحدث. ثم عندما وقع الحدث، استخدم الطريقة Text للقيام ToString على 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(); }
   }
}

ويمكنك ربط الخاصية Text مربع نص إلى خاصية سلسلة ... الكائن سلسلة غير قابل للتغيير، ولكن متغير من نوع سلسلة غير قابلة للتغيير تماما ...

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

وأنت في حاجة لاتمامه في كائن التي تطبق INotifyPropertyChanged، ولكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top