WPFを使用して、ユーザーのテキストの外観(下線、太字、フォントサイズの変更など)を変更するなどの基本的な書式設定機能を提供する、非常に簡単なドキュメントエディタを構築しています。CommandBindingでINotifyPropertyChangedを妨害する
私は、ユーザーの入力用にいくつかのRichTextBoxを実装しており、Microsoft Wordと同様の書式設定オプションの切り替え状態を示すボタンを表示したいと考えています。たとえば、ユーザーがCTRL + Bを押すと、入力されたすべてのテキストが太字になり、「太字」ボタンがこの状態を反映します(押し下げられます)。
この時点で、ボタンのIsCheckedプロパティ(カスタムボタンを使用)は、プロパティ(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));
}
}
は、私たちはあなたのコードの多くを見ることができますか? –