【发布时间】:2015-04-07 16:56:56
【问题描述】:
我正在为所见即所得的 HTML 编辑器制作 Ribbon 控件。功能区具有您希望看到的典型粗体、斜体、下划线、FontFamily 等控件。我将重点介绍本示例的 Bold 功能。
我希望 Ribbon 可重用,因此我在控件的代码后面(标准样板代码)中添加了一个依赖属性 (DP) 和关联的属性包装器:
public partial class EditorRibbon: UserControl
{
public static readonly DependencyProperty IsBoldProperty =
DependencyProperty.Register(
"IsBold",
typeof (bool),
typeof (EditorRibbon),
new PropertyMetadata(default(bool)));
public bool IsBold
{
get { return (bool) GetValue(IsBoldProperty); }
set { SetValue(IsBoldProperty, value); }
}
}
...在 XAML 中我有我的 RibbonToggleButton,并且我已将 IsChecked 属性绑定到依赖属性:
<UserControl x:Class="My.EditorRibbon">
<r:RibbonToggleButton Command="ToggleBold"
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"
SmallImageSource="{StaticResource ToggleBoldIcon}"
IsChecked="{Binding IsBold}" />
</UserControl>
在我的Editor 窗口中,我已将EditorRibbon 的IsBold 属性绑定到窗口的ViewModel 上的常规属性:
<Window x:class="My.MainWindow>
<My.EditorRibbon IsBold="{Binding SelectionIsBold}"/>
</Window>
这是SelectionIsBold 属性:
public bool SelectionIsBold
{
get { return _selection.IsBold(); }
}
...每当RichTextBox 中的选择发生变化时,我都会引发NotifyPropertyChanged() 事件(在MainWindow 的ViewModel 中):
public class MainWindowViewModel : BaseViewModel
{
public MainWindowViewModel(MainWindow window)
{
rtb.SelectionChanged += rtb_OnSelectionChanged;
}
private void rtb_OnSelectionChanged(object sender, RoutedEventArgs routedEventArgs)
{
NotifyPropertyChanged(()=>SelectionIsBold);
}
}
在我看来,这应该足以在选择更改时更改RibbonToggleButton 的IsChecked 状态......但事实并非如此。尽管更改了选择,尽管NotifyPropertyChanged() 按预期触发,SelectionIsBold 属性上的断点(是的,我已取消选择 VS 的“Step Over Property”设置)永远不会命中。在某处,刷新值的请求未正确传播。
在 setter 中设置值后,是否需要在 IsBold 属性上触发 NotifyPropertyChanged()?
【问题讨论】:
-
你不需要绑定你的命令吗? Command="{Binding ToggleBold}"
-
“rtb_OnSelectionChanged”在哪里
-
@Neil - rtb_OnSelectionChanged 位于包含 RichTextBox 和 EditorRibbon 的窗口中。
-
@ScottNimrod - 不。该命令按原样完美运行。
-
需要指定 UpdateSourceTrigger 还是指定 Mode 为 TwoWay?
标签: c# wpf xaml dependency-properties