CommandBinding干扰INotifyPropertyChanged

时间:2009-07-22 14:22:41

标签: c# wpf inotifypropertychanged commandbinding

使用WPF,我正在构建一个非常简单的文档编辑器,它将提供基本的格式化功能,例如修改用户文本外观的功能,即下划线,粗体,更改字体大小等。

我已经为用户的输入实现了几个RichTextBox,并希望显示一个按钮,说明类似于Microsoft Word的格式化选项的切换状态。例如,如果用户按下CTRL + B,则所有输入的文本都将为粗体,而“粗体”按钮则反映此状态(按下)。

此时,按钮的IsChecked属性(使用自定义按钮)被绑定到Property(IsSelectedTextBold)。使用richTextBox.SelectionChanged来检测选择更改,我调用OnPropertyChanged(“IsSelectedTextBold”)(在下面定义)。这按预期工作;但是,当用户突出显示单词并按下CTRL + B时​​,选择的字体粗细将更改为粗体,但该按钮不会反映更改,因为不会引发richTextBox.SelectionChanged事件。寻找一种方法来检测用户何时按下CTRL + B,我注册了我自己的CommandBinding:

CommandManager.RegisterClassCommandBinding(typeof(RichTextBox),
    new CommandBinding(EditingCommands.ToggleBold, 
    new ExecutedRoutedEventHandler(ToggleBold_Executed),
    new CanExecuteRoutedEventHandler(ToggleBold_CanExecute)));

ToggleBold_Executed()实现切换粗体并调用OnPropertyChanged(“IsSelectedTextBold”)以通知按钮发生了更改。

由于某种原因,PropertyChanged设置为null,并且在从ToggleBold_Executed()函数引发时不会触发,但在richTextBox_SelectionChanged事件调用时工作正常。

作为旁注,我还考虑将Button的IsChecked属性绑定到RichTextBox.FontWeight(带有必要的转换器)。唯一阻止我这样做的是拥有多个RichTextBox。不确定我是否要将按钮动态绑定和取消绑定到活动的RichTextBox。

感谢您忍受冗长的帖子 - 任何帮助将不胜感激。谢谢!

private void OnPropertyChanged(string propertyName)
{
  if (this.PropertyChanged != null)
  {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

1 个答案:

答案 0 :(得分:1)

我仍然没有找到原始问题的答案,但这是一篇博文,为我的目标提供了解决方案:http://www.howtocode.net/software-development/general/extending-wpf-commands