【问题标题】:How to bind and refresh UserControl binding in WPF?如何在 WPF 中绑定和刷新 UserControl 绑定?
【发布时间】:2015-06-17 13:02:30
【问题描述】:

我正在尝试为用户控件做一个简单的 OneWay 绑定,但老实说,我不明白为什么某些部分不起作用。 简单起见,我创建了一个带有一些依赖属性的 WPF 标准 UserControl。 在我的主窗口中,我根据某些事件隐藏/显示 UserControl,并将属性绑定到我的主窗口视图模型数据。 但是,这样做不会使我的 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 中的这个绑定到我的主窗口视图模型的 SearchString 成员

<local:DisplayMailView SearchString="{Binding DataContext.SearchString, RelativeSource={RelativeSource AncestorType={x:Type Window}}, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True,NotifyOnTargetUpdated=True,Mode=TwoWay}"/>

在我的 ViewModel 上:

 public string SearchString
    {
        get
        {
            return _searchString;
        }
        set
        {
            _searchString = value;
            if (!string.IsNullOrWhiteSpace(value))
                DataGridService.FocusFirstRow();
            RaisePropertyChanged();
        }
    }

我在主窗口视图模型中的 SearchString 集合中设置了一个断点,该值已设置。但是,当我在 UserControl 上的 SearchString 集合中设置断点时,它永远不会触发?

另外,我的 UserControl 的 dataContext 已设置:

    (this.Content as FrameworkElement).DataContext = this;

我确切地说我的 UserControl 构造函数在启动时只被调用一次,其他的东西必须根据用户操作动态刷新。

有人有想法吗?我在输出窗口中没有错误 谢谢

【问题讨论】:

    标签: c# wpf mvvm data-binding user-controls


    【解决方案1】:

    这是一个常见的误解。当 DependencyProperty 的值更改时,不会执行其 CLR 属性的 set 中的代码。如果要在属性值更改时执行某些代码,则需要使用 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);
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 2011-08-06
      • 2021-07-19
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2011-06-27
      相关资源
      最近更新 更多