WPF ::自定义控件的依赖项属性不起作用

时间:2015-04-07 16:56:57

标签: c# wpf xaml dependency-properties

我正在为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()?

4 个答案:

答案 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}"