WPF: прикрепленное поведение регистрируется, но никогда не вызывается? - PullRequest
0 голосов
/ 03 августа 2010

пробует мое первое присоединенное поведение: я хочу привязать TextSelection RichTextBox к свойству ViewModel:

public TextSelection SelectedRichText {get;set;}

Таким образом я связываю его:

<RichTextBox behavior:RichTextBoxSelectionBehavior.RichTextBoxSelection="{Binding SelectedRichText}" />

мой код и у меня есть 2 вопроса:

1) Почему OnRichTextBoxSelectionPropertyChanged никогда не вызывается?2) см. Вопрос, этот метод внизу: OnRichTextBoxGotSelectedText

public static class RichTextBoxSelectionBehavior
    {

        public static TextSelection GetRichTextBoxSelection(DependencyObject obj)
        {
            return (TextSelection)obj.GetValue(RichTextBoxSelection);
        }

        public static void SetRichTextBoxSelection(DependencyObject obj, TextSelection value)
        {
            obj.SetValue(RichTextBoxSelection, value);
        }

        // Using a DependencyProperty as the backing store for MyProperty.      
        public static readonly DependencyProperty RichTextBoxSelection =
            DependencyProperty.RegisterAttached
            (
                "RichTextBoxSelection", 
                typeof(TextSelection),
                typeof(RichTextBoxSelectionBehavior),
                new UIPropertyMetadata(OnRichTextBoxSelectionPropertyChanged)
            );

        private static void OnRichTextBoxSelectionPropertyChanged(DependencyObject dpo, DependencyPropertyChangedEventArgs args)
        {
            RichTextBox rtb = dpo as RichTextBox;

            if (rtb != null)
            {
                if ( !((TextSelection)args.NewValue).IsEmpty)
                {
                    // if the TextSelected has selected text hook up the RichTextBox intenal SelectedChanged event with my own
                    rtb.SelectionChanged += OnRichTextBoxGotSelectedText;
                }
                else
                {
                    rtb.SelectionChanged -= OnRichTextBoxGotSelectedText;
                }
            }
        }

        private static void OnRichTextBoxGotSelectedText(object sender, RoutedEventArgs e)
        {
            RichTextBox rtb = (RichTextBox) sender;

            // How can I pass now my rtb.Selection to the property the behavior is bound to? e.g. my SelectedRichText property in the ViewModel

            //Action action = () => { rtb.Selection; };
            //rtb.Dispatcher.BeginInvoke(action, DispatcherPriority.ContextIdle);
        }
    }

1 Ответ

0 голосов
/ 14 августа 2010

Я перепутал прикрепленное поведение со свойством зависимости, вот решение:

Поместите RichTExtBox в UserControl и этот код тоже:

     // SelectedText property. 
            public static readonly DependencyProperty SelectedTextProperty =
                DependencyProperty.Register("SelectedText", typeof(TextSelection),
                typeof(MyRichTextBox ));

      /// <summary>
            /// Default constructor.
            /// </summary>
            public MyRichTextBox ()
            {
                InitializeComponent();

                this.TextBox.SelectionChanged += new RoutedEventHandler(TextBox_SelectionChanged);
            }

            void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
            {
                var sT = (e.OriginalSource as RichTextBox).Selection;
                SelectedText = sT;
            }




   /// <summary>
    /// The WPF Selected Text of the FlowDocument in the control
    /// </summary>
    public TextSelection SelectedText
    {
        get { return (TextSelection)GetValue(SelectedTextProperty); }
        set { SetValue(SelectedTextProperty, value); }
    } 

    //UserControl embedded in the MainWindow.xaml
      <My:MyRichTextBox SelectedText="{Binding SelectedDocument,Mode=TwoWay}" x:Name="EditBox" />

Теперь у вас есть доступ к TextSelection richtextbox в вашей ViewModel!

...