我正在为WYSIWYG HTML编辑器制作Ribbon
控件。功能区具有您期望看到的典型粗体,斜体,下划线,字体系列等控件。我将重点关注此示例的粗体功能。
我希望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
窗口中,我将IsBold
的{{1}}属性绑定到窗口ViewModel上的常规属性:
EditorRibbon
以下是<Window x:class="My.MainWindow>
<My.EditorRibbon IsBold="{Binding SelectionIsBold}"/>
</Window>
属性:
SelectionIsBold
...每当public bool SelectionIsBold
{
get { return _selection.IsBold(); }
}
中的选择发生变化时,我就会引发NotifyPropertyChanged()
事件(在MainWindow的ViewModel中):
RichTextBox
在我看来,这应该足以在选择更改时更改public class MainWindowViewModel : BaseViewModel
{
public MainWindowViewModel(MainWindow window)
{
rtb.SelectionChanged += rtb_OnSelectionChanged;
}
private void rtb_OnSelectionChanged(object sender, RoutedEventArgs routedEventArgs)
{
NotifyPropertyChanged(()=>SelectionIsBold);
}
}
的{{1}}状态......但事实并非如此。尽管更改了选择,并且尽管IsChecked
按预期触发,但RibbonToggleButton
属性上的断点(是,我已取消选择VS的“跳过属性”设置)从未打过。在某处,刷新值的请求没有正确传播。
在setter中设置值后,是否需要在IsBold属性上触发NotifyPropertyChanged()?
答案 0 :(得分:0)
将IsBold绑定更改为以下
<UserControl x:Class="My.EditorRibbon" x:Name="EditorRibbonInstance">
<r:RibbonToggleButton Command="ToggleBold"
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"
SmallImageSource="{StaticResource ToggleBoldIcon}"
IsChecked="{Binding IsBold, ElementName=EditorRibbonInstance, Mode=TwoWay}" />
</UserControl>
有了这个,你确定绑定是转到控件的属性而不是控件的datacontext
答案 1 :(得分:0)
您必须在ViewModel中触发notifypropertychanged。在ViewModel中尝试这样的事情:
protected void FirePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
->> FirePropertyChanged("SelectionIsBold")
原因是:现在,您的数据上下文是ViewModel,ViewModel的所有绑定都必须由ViewModel的属性触发
答案 2 :(得分:0)
首先,我之前从未见过将窗口注入ViewModel ......您是否正在使用某种DI进行注射?
我认为在viewmodel上使用选择更改事件不是一个好主意......从我的观点来看,这不是mvvm ...
你在某处更新了_selection吗?你可能总是检查相同的选择吗?!
答案 3 :(得分:-1)
您没有正确绑定按钮的命令属性。
应该反映这样的事情:
Command="{Binding ToggleBold}"