2009-07-22 17 views
1

Mit WPF erstellen ich einen sehr einfachen Dokumenteditor, der grundlegende Formatierungsfunktionen wie die Möglichkeit zum Ändern des Aussehens eines Benutzertexts, z. B. Unterstreichen, Fettschrift, Ändern der Schriftgröße usw., bietet.CommandBinding Interferieren mit INotifyPropertyChanged

Ich habe mehrere RichTextBox für die Eingaben des Benutzers implementiert und möchte eine Schaltfläche anzeigen, die den Umschaltstatus der Formatierungsoptionen ähnlich wie Microsoft Word veranschaulicht. Wenn der Benutzer beispielsweise STRG + B drückt, ist der gesamte eingegebene Text fett und die Schaltfläche "Fett" zeigt diesen Status an (gedrückt).

An dieser Stelle ist die IsChecked-Eigenschaft der Schaltfläche (mithilfe einer benutzerdefinierten Schaltfläche) an eine Eigenschaft gebunden (IsSelectedTextBold). Mit dem Befehl richTextBox.SelectionChanged zum Erkennen von Auswahländerungen rufe ich OnPropertyChanged ("IsSelectedTextBold") auf (wie unten definiert). Dies funktioniert wie erwartet; Wenn ein Benutzer jedoch ein Wort hervorhebt und STRG + B drückt, wird die Schriftgröße der Auswahl in Fettschrift geändert, aber die Schaltfläche spiegelt die Änderung nicht wider, da das Ereignis richTextBox.SelectionChanged nicht ausgelöst wurde. Suchen Sie nach einer Methode zu erkennen, wenn der Benutzer STRG + B drückt, registriert ich meine eigene Command:

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

ToggleBold_Executed() implementiert die fett Makeln und ruft OnPropertyChanged („IsSelectedTextBold“), um die Taste zu informieren, dass eine Änderung hat aufgetreten.

Aus irgendeinem Grund wird PropertyChanged auf null festgelegt und nicht ausgelöst, wenn von der Funktion ToggleBold_Executed() ausgelöst, funktioniert aber einwandfrei, wenn vom RichTextBox_SelectionChanged-Ereignis aufgerufen.

Als eine Randnotiz habe ich auch überlegt, die IsChecked-Eigenschaft der Schaltfläche an die RichTextBox.FontWeight zu binden (mit einem notwendigen Konverter). Das einzige, was mich daran hindert, ist, mehrere RichTextBoxen zu haben. Ich bin mir nicht sicher, ob ich die Schaltfläche dynamisch an die aktive RichTextBox binden und von ihr lösen möchte.

Vielen Dank für die langen Post - jede Hilfe würde sehr geschätzt werden. Vielen Dank!

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

können wir mehr von Ihrem Code sehen? –

Antwort

Verwandte Themen