C# 如何在WPF中绑定和刷新UserControl绑定?

C# 如何在WPF中绑定和刷新UserControl绑定?,c#,wpf,mvvm,data-binding,user-controls,C#,Wpf,Mvvm,Data Binding,User Controls,我试图为用户控件做一个简单的单向绑定,但我真的不明白为什么有些部分不能工作。 简单地说,我创建了一个WPF标准UserControl,其中包含一些依赖属性。 在主窗口中,根据某些事件隐藏/显示UserControl,并将属性绑定到主窗口viewmodel数据。 但是,这样做不会使我的UserControl刷新某些部分。例如,我的UserControl上有一个SearchString依赖项属性: public static readonly DependencyProperty SearchStr

我试图为用户控件做一个简单的单向绑定,但我真的不明白为什么有些部分不能工作。 简单地说,我创建了一个WPF标准UserControl,其中包含一些依赖属性。 在主窗口中,根据某些事件隐藏/显示UserControl,并将属性绑定到主窗口viewmodel数据。 但是,这样做不会使我的UserControl刷新某些部分。例如,我的UserControl上有一个SearchString依赖项属性:

public static readonly DependencyProperty SearchStringProperty = DependencyProperty.Register("SearchString",
           typeof(string), typeof(DisplayMailView), new UIPropertyMetadata(null));

public string SearchString
    {
        get { return (string)GetValue(SearchStringProperty); }
        set
        {
            SetValue(SearchStringProperty, value);
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("SearchString"));
            }
            var loFinds = richEditControl1.Document.FindAll(SearchString, SearchOptions.WholeWord);

            foreach (var find in loFinds)
            {
                var oDoc = find.BeginUpdateDocument();
                var oChars = oDoc.BeginUpdateCharacters(find);
                oChars.BackColor = System.Drawing.Color.Yellow;
                oDoc.EndUpdateCharacters(oChars);
                find.EndUpdateDocument(oDoc);
            }
        }
    }
UserControl中的这个绑定到我的主窗口viewmodel的SearchString成员

<local:DisplayMailView SearchString="{Binding DataContext.SearchString, RelativeSource={RelativeSource AncestorType={x:Type Window}}, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True,NotifyOnTargetUpdated=True,Mode=TwoWay}"/>
我在主窗口viewmodel中的SearchString集合中放置了一个断点,该值已设置。但是,当我在UserControl上的SearchString集合中设置断点时,它永远不会触发

此外,还设置了my UserControl的dataContext:

    (this.Content as FrameworkElement).DataContext = this;
我的UserControl构造函数在启动时只调用一次,其他内容必须根据用户操作动态刷新

有人有主意吗?我在输出窗口中没有错误
谢谢这是一个常见的误解。当DependencyProperty的值更改时,将不执行其CLR属性的
集中的代码。如果希望在属性值更改时执行某些代码,则需要使用PropertyChanged回调

您的UserControl代码应该如下所示:

public static readonly DependencyProperty SearchStringProperty =
    DependencyProperty.Register(
        "SearchString",
        typeof(string),
        typeof(DisplayMailView),
        new UIPropertyMetadata(null, OnSearchStringChanged));
        // This sets OnSearchStringChanged as the PropertyChanged callback

public string SearchString
{
    get { return (string)GetValue(SearchStringProperty); }
    set
    {
        SetValue(SearchStringProperty, value);
        //  Any code you put here won't be executed 
        // when the DependencyProperty value changes
    }
}

private static void OnSearchStringChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    //  This part is not needed, DependencyProperties already
    // notify of their changes automatically
    //if (PropertyChanged != null)
    //{
    //    PropertyChanged(this, new PropertyChangedEventArgs("SearchString"));
    //}

    var control = sender as DisplayMailView;     

    var loFinds = control.richEditControl1.Document.FindAll(SearchString, SearchOptions.WholeWord);

     foreach (var find in loFinds)
     {
         var oDoc = find.BeginUpdateDocument();
         var oChars = oDoc.BeginUpdateCharacters(find);
         oChars.BackColor = System.Drawing.Color.Yellow;
         oDoc.EndUpdateCharacters(oChars);
         find.EndUpdateDocument(oDoc);
     }
}

这是一种常见的误解。当DependencyProperty的值更改时,将不执行其CLR属性的
集中的代码。如果希望在属性值更改时执行某些代码,则需要使用PropertyChanged回调

您的UserControl代码应该如下所示:

public static readonly DependencyProperty SearchStringProperty =
    DependencyProperty.Register(
        "SearchString",
        typeof(string),
        typeof(DisplayMailView),
        new UIPropertyMetadata(null, OnSearchStringChanged));
        // This sets OnSearchStringChanged as the PropertyChanged callback

public string SearchString
{
    get { return (string)GetValue(SearchStringProperty); }
    set
    {
        SetValue(SearchStringProperty, value);
        //  Any code you put here won't be executed 
        // when the DependencyProperty value changes
    }
}

private static void OnSearchStringChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    //  This part is not needed, DependencyProperties already
    // notify of their changes automatically
    //if (PropertyChanged != null)
    //{
    //    PropertyChanged(this, new PropertyChangedEventArgs("SearchString"));
    //}

    var control = sender as DisplayMailView;     

    var loFinds = control.richEditControl1.Document.FindAll(SearchString, SearchOptions.WholeWord);

     foreach (var find in loFinds)
     {
         var oDoc = find.BeginUpdateDocument();
         var oChars = oDoc.BeginUpdateCharacters(find);
         oChars.BackColor = System.Drawing.Color.Yellow;
         oDoc.EndUpdateCharacters(oChars);
         find.EndUpdateDocument(oDoc);
     }
}