WPF RichTextBox 와 Document의 바인딩

MVVM 패턴을 이용해서 View의 TextBox 등에 바인딩은 간단하게

<TextBox Text="{Binding mystring}"/>

이렇게 하면 된다.

RichTextBox 도 마찬가지 일것 같지만, 해보면 안된다. 먼저 RichTextBox가 Content를 표현하는 구조를 알아야 되는데, 그건, 다음에 정리하고, 바인딩 하는 방법은 아래와 같다.

먼저 ViewModel 을 DependencyObject 를 상속고 DependencyProperty 를 정의해준다.


public class MyViewModel : DependencyObject
{
    public FlowDocument Document
    {
        get { return (FlowDocument)GetValue(DocumentProperty); }
        set { SetValue(DocumentProperty, value); }
    }

    public static readonly DependencyProperty DocumentProperty =
        DependencyProperty.Register("Document", typeof(FlowDocument), typeof(MyViewModel), new PropertyMetadata(OnDocumentChanged));

    public void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }
}

그 다음 View 의 code-behind 의 생성자에
InitializeComponent();

Binding b = new Binding("Document");
b.Source = richTextBox;
b.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(DataContext as MyViewModel, MyViewModel.DocumentProperty, b);

하면 바인딩이 된다.

테스트 코드는 아래 처럼 하면 RichTextBox의 내용이 추가되는걸 볼수 있다.



FlowDocument d = new FlowDocument(); Paragraph g = new Paragraph(); Run a = new Run(); a.Text = "코드에서 추가된 text"; g.Inlines.Add(a); d.Blocks.Add(g); hasDocument.Document = d;

아직까진 이방법만 해보았는데, 더 좋은 다른 방법이 있을것같다.
위 코드는 View가 ViewModel을 알아야 된다. MVVM에서 View는 ViewModel의 단순한 소비자의 하나일 뿐이므로 code-behind가 없는게 가장 좋을것 같다.

또, 단점은 캐럿을 가져와서 text를 추출해보면 TextPointer 위치가 이상하게 간다.
이것또한 RichTextBox 의 구조를 이해하지 못해서인것 같다.

아마 , UserControl을 생성하면서 RichTextBox가 Document를 바인딩 할수 있도록 하는것이 가능할것 같다.

좀더 공부해야겠다. 아.. 이거 코드하일라이트 더 괜춘한건 없나... ㅡㅡ;

댓글

이 블로그의 인기 게시물

C#에서 포인터 사용

WPF 이미지위에 라인 그리기(WPF DrawLine on exist Image)