WPF.
У меня есть поведение:
public class RichTextBehavior : Behavior<RichTextBox>
{
public bool TextBold
{
get { return (bool)GetValue(TextBoldProperty); }
set { SetValue(TextBoldProperty, value); }
}
// Using a DependencyProperty as the backing store for TextBold. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextBoldProperty =
DependencyProperty.Register("TextBold", typeof(bool), typeof(RichTextBehavior),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextBoldChanged));
private static void OnTextBoldChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behavior = d as RichTextBehavior;
TextRange tr = new TextRange(behavior.AssociatedObject.Selection.Start, behavior.AssociatedObject.Selection.End);
if (tr == null)
return;
// This Works, but also adds keyboard commands.
//EditingCommands.ToggleBold.Execute(null, behavior.AssociatedObject);
if ((bool)e.NewValue)
//TextSelection ts = richTextBox.Selection;
tr.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
else
tr.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal);
}
Это прикреплено к RichTextBox как:
<RichTextBox x:Name="RichTextControl" ...
>
<i:Interaction.Behaviors>
<b:RichTextBehavior TextFont="{Binding ElementName=Fonttype, Path=SelectedItem, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
</RichTextBox>
Я хотел бы привязать свойство ToggleButton IsChecked к свойству TextBold поведения (в XAML), что-то например:
<ToggleButton Name="ToggleBold" Command="EditingCommands.ToggleBold"
CommandTarget="{Binding ElementName=RichTextControl}"
IsChecked="{Binding ElementName=RichTextControl, Path=(TextBold), Mode=TwoWay}"
.......................................
</ToggleButton>
Как это делается? Каков синтаксис? Любая идея высоко ценится. ТИА
Редактировать:
Я считаю, что это должно работать, но это не так. В действии нажатие кнопки Bold Toggle ИЗМЕНЯЕТ печатный текст в RichTextBox (как и должно быть с EditingCommands.ToggleBold), но, как и раньше, выделение текста уже в RichTextBox НЕ изменяет состояние ToggleBold при привязке к IsChecked имущество.
Я считаю, что это должно было сработать (но, похоже, не соблюдает привязку IsChecked):
<ToggleButton Name="ToggleBold"
Command="EditingCommands.ToggleBold" CommandTarget="{Binding ElementName=RichTextControl}"
IsChecked="{Binding ElementName=RichTextControl,
Path=(b:RichTextBehavior.TextBold), Mode=TwoWay}"........
Я мог бы добавить, что по какой-то причине каждое нажатие клавиши в RichTextBox, кажется, дважды вызывает SelectionChanged в поведении (а не один раз, как я ожидал), и второй вызов, похоже, не имеет уже установленного значения первого вызова . Странный.