2009-07-22 118 views
1

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

我已经为用户的输入实现了几个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(带有必要的转换器)。阻止我这样做的唯一方法是使用多个RichTextBoxes。不确定是否要将按钮动态绑定和取消绑定到活动的RichTextBox。

感谢您经历了漫长的职位 - 任何帮助将不胜感激。谢谢!

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

我们可以看到更多的代码? – 2009-07-22 14:37:52

回答