首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >干扰INotifyPropertyChanged的CommandBinding

干扰INotifyPropertyChanged的CommandBinding
EN

Stack Overflow用户
提问于 2009-07-22 14:22:41
回答 1查看 423关注 0票数 1

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

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

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

代码语言:javascript
复制
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事件调用时工作得很好。

顺便说一句,我还考虑过将按钮的IsChecked属性绑定到RichTextBox.FontWeight (使用必要的转换器)。唯一阻止我这样做的事情就是拥有多个RichTextBoxes。不确定是否要将按钮动态绑定和解除绑定到active RichTextBox。

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

代码语言:javascript
复制
private void OnPropertyChanged(string propertyName)
{
  if (this.PropertyChanged != null)
  {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}
EN

回答 1

Stack Overflow用户

发布于 2009-07-23 11:12:34

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1165636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档