텍스트 상자 컨트롤을 StringBuilder 인스턴스에 바인딩하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/413675

문제

여러 텍스트 상자가 기본 문자열의 변경에 반응하기를 원합니다. 따라서 문자열의 내용을 변경하려면 모든 텍스트 상자도 컨텐츠를 변경합니다.

이제는 불변이기 때문에 문자열 유형을 사용할 수 없습니다. 그래서 나는 StringBuilder와 함께 갔다. 그러나 텍스트 상자 객체의 텍스트 속성은 문자열 만 가져갑니다.

텍스트 상자의 텍스트 속성에 StringBuilder 객체를 "바인딩"하는 쉬운 방법이 있습니까?

많은 감사합니다!

추신 : 텍스트 박스는 현재 WPF입니다. 그러나 모노 때문에 Windows 양식으로 전환 할 수 있습니다.

도움이 되었습니까?

해결책

Getter가 StringBuilder의 Tostring ()을 반환하는 속성을 항상 노출시킬 수 있습니다. 그런 다음 양식은이 속성에 결합 할 수 있습니다.

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를 wpf의 TextBox에 바인딩하는 데 사용합니다.

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 메소드를 노출시킬 수 있습니다.

텍스트 상자를 상속하고 텍스트 속성을 무시하여 문자열 빌더에 검색하고 쓸 수 있습니다.

간단히 말해, 아니요. 텍스트 속성은 문자열 만 가져갑니다. 따라서 소스가 무엇이든 스트링으로 변환해야합니다.

많은 텍스트 상자에 대해 한 번 쉽게 설정할 수 있으려면 항상 모든 텍스트 상자 값을 설정하는 클래스 속성을 가질 수 있습니다 ...

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

나는 그것을 포장 할 것이다 StringBuilder an이있는 사용자 정의 클래스에서 Add 방법, Text 방법 및 an OnChanged 이벤트.

와이어 위로 Add 호출 될 때 텍스트를 다음에 추가하는 방법 StringBuilder 인스턴스 및 이벤트를 시작합니다. 그런 다음 이벤트가 시작되면 사용하십시오 Text 수행 방법 ToStringStringBuilder.

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

텍스트 상자의 텍스트 속성을 문자열 속성에 바인딩 할 수 있습니다 ... 문자열 객체는 불변이지만 유형의 변수는 완벽하게 변하기 쉽습니다 ...

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

그러나 inotifypropertychanged를 구현하는 물체에 그것을 마무리해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top