2012-04-18 4 views
0

안녕하세요 저는 WPF 및 MVVM 패턴을 사용하고 있습니다. 그래서 내 문제는 내가 선택한 RichTextBox의 텍스트를 내 ViewModel의 속성에 바인딩하려고하지만 Selection 속성을 바인딩 할 수 없다는 것입니다.RichTextBox의 선택된 텍스트를 ViewModel의 속성에 바인딩

어떻게하면됩니까?

RichTextBox의 Selection 속성을 내 ViewModel의 속성에 바인딩하는 것은 효과와 장식을 텍스트에 적용하는 것이 더 효과적이라고 생각하는 방식입니다.

ViewModel에서 RichTextBox의 선택된 텍스트를 아는 더 좋은 방법을 알고 있다면 알려주십시오. 나는 FlowDocuments에 대해 배우기 시작했고 RichTextBox로 작업하기 때문에 조금 잃어 버렸습니다.

미리 감사드립니다.

+0

(SelectedText 당신의 ViewModel에 문자열 속성은 임) [RichTextBox.Selection 속성] (http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.selection.aspx)에 바인딩하지 마십시오. – LPL

+1

http://stackoverflow.com/a/2641774/620360도 참조하십시오. 어쩌면 이것은 시작일 것입니다. – LPL

답변

2

당신은 Behavior 사용할 수 있습니다

public class RichTextSelectionBehavior : Behavior<RichTextBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.SelectionChanged += RichTextBoxSelectionChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.SelectionChanged -= RichTextBoxSelectionChanged; 
    } 

    void RichTextBoxSelectionChanged(object sender, System.Windows.RoutedEventArgs e) 
    { 
     SelectedText = AssociatedObject.Selection.Text; 
    } 

    public string SelectedText 
    { 
     get { return (string)GetValue(SelectedTextProperty); } 
     set { SetValue(SelectedTextProperty, value); } 
    } 

    public static readonly DependencyProperty SelectedTextProperty = 
     DependencyProperty.Register(
      "SelectedText", 
      typeof(string), 
      typeof(RichTextSelectionBehavior), 
      new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedTextChanged)); 

    private static void OnSelectedTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var behavior = d as RichTextSelectionBehavior; 
     if (behavior == null) 
      return; 
     behavior.AssociatedObject.Selection.Text = behavior.SelectedText; 
    } 
} 

XAML 사용을 :

<RichTextBox> 
     <i:Interaction.Behaviors> 
      <local:RichTextSelectionBehavior SelectedText="{Binding SelectedText}" /> 
     </i:Interaction.Behaviors> 
    </RichTextBox> 

가 아닌`DependencyProperty` 당신이 할 수있는이기 때문에

관련 문제