WPF RichTextBox 와 Document의 바인딩
MVVM 패턴을 이용해서 View의 TextBox 등에 바인딩은 간단하게
이렇게 하면 된다.
RichTextBox 도 마찬가지 일것 같지만, 해보면 안된다. 먼저 RichTextBox가 Content를 표현하는 구조를 알아야 되는데, 그건, 다음에 정리하고, 바인딩 하는 방법은 아래와 같다.
먼저 ViewModel 을 DependencyObject 를 상속고 DependencyProperty 를 정의해준다.
그 다음 View 의 code-behind 의 생성자에
테스트 코드는 아래 처럼 하면 RichTextBox의 내용이 추가되는걸 볼수 있다.
아직까진 이방법만 해보았는데, 더 좋은 다른 방법이 있을것같다.
위 코드는 View가 ViewModel을 알아야 된다. MVVM에서 View는 ViewModel의 단순한 소비자의 하나일 뿐이므로 code-behind가 없는게 가장 좋을것 같다.
또, 단점은 캐럿을 가져와서 text를 추출해보면 TextPointer 위치가 이상하게 간다.
이것또한 RichTextBox 의 구조를 이해하지 못해서인것 같다.
아마 , UserControl을 생성하면서 RichTextBox가 Document를 바인딩 할수 있도록 하는것이 가능할것 같다.
좀더 공부해야겠다. 아.. 이거 코드하일라이트 더 괜춘한건 없나... ㅡㅡ;
<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를 바인딩 할수 있도록 하는것이 가능할것 같다.
좀더 공부해야겠다. 아.. 이거 코드하일라이트 더 괜춘한건 없나... ㅡㅡ;
댓글
댓글 쓰기