[英]OneWay binding for ToggleButton's IsChecked property in WPF
[英]Syntax to bind a ToggleButton IsChecked property to a RichTextBox's attached behavior
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>
我想一个切换按钮物业器isChecked绑定的行为(在XAML)的“TextBold”属性, 是这样的 :
<ToggleButton Name="ToggleBold" Command="EditingCommands.ToggleBold"
CommandTarget="{Binding ElementName=RichTextControl}"
IsChecked="{Binding ElementName=RichTextControl, Path=(TextBold), Mode=TwoWay}"
.......................................
</ToggleButton>
怎么做? 语法是什么? 任何想法都非常感谢。 TIA
编辑:
我认为这应该可以,但是不能。 实际上,按下Bold Toggle按钮不会更改RichTextBox上的键入文本(就像使用EditingCommands.ToggleBold一样),但是像以前一样,选择RichTextBox中已经存在的文本绑定到IsChecked时不会更改ToggleBold的状态。属性。
我相信这应该起作用(但似乎不尊重IsChecked绑定):
<ToggleButton Name="ToggleBold"
Command="EditingCommands.ToggleBold" CommandTarget="{Binding ElementName=RichTextControl}"
IsChecked="{Binding ElementName=RichTextControl,
Path=(b:RichTextBehavior.TextBold), Mode=TwoWay}"........
由于某种原因,我可能会添加,RichTextBox中的每个按键似乎都在行为中两次调用SelectionChanged(而不是我期望的一次),并且第二个调用似乎没有第一个调用的已设置值。 奇怪的。
也许这就是您想要的:
<RichTextBox x:Name="RichTextControl">
<i:Interaction.Behaviors>
<b:RichTextBehavior TextBold="{Binding ElementName=toggleBold,Path=IsChecked}" />
</i:Interaction.Behaviors>
</RichTextBox>
<ToggleButton x:Name="toggleBold" Content="Bold" />
您可以在“行为”中处理SelectionChanged
事件:
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += RichTextBoxSelectionChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SelectionChanged -= RichTextBoxSelectionChanged;
}
并通过使用GetPropertyValue
TextBold
设置TextBold
:
void RichTextBoxSelectionChanged(object sender, System.Windows.RoutedEventArgs e)
{
TextRange tr = new TextRange(AssociatedObject.Selection.Start, AssociatedObject.Selection.End);
if (tr == null)
return;
FontWeight g = (FontWeight)tr.GetPropertyValue(TextElement.FontWeightProperty);
TextBold = g == FontWeights.Bold;
}
使用两种方式绑定(我使用CheckBox
):
<StackPanel>
<RichTextBox x:Name="RichTextControl" >
<i:Interaction.Behaviors>
<local:RichTextBehavior TextBold="{Binding ElementName=fonttype, Path=IsChecked, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
</RichTextBox>
<CheckBox x:Name="fonttype" Content="Is Bold" />
</StackPanel>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.