2015-06-17 68 views
1

我正在尝试为用户控件做一个简单的OneWay绑定,但我真的不明白为什么有些部件不工作。为了简单起见,我创建了一个具有一些依赖项属性的WPF标准UserControl。 在我的主窗口中,根据某些事件隐藏/显示UserControl,并将属性绑定到我的主窗口viewmodel数据。 但是,这样做不会让我的UserControl刷新某些部分。对于为例,我有一个搜索依赖属性上我的用户:如何绑定和刷新WPF中的UserControl绑定?

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); 
      } 
     } 
    } 

这一个在用户控件绑定到我的主窗口视图模型

<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(); 
     } 
    } 

我在我的主窗口viewmodel的一个我的搜索字符串放置一个断点,值被设置。然而,当我把一个断点放到UserControl的SearchString的集合中时,它永远不会触发?

而且,我的用户的DataContext设置:

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

我精确,以至于我的用户构造函数只调用在启动一次,其他的事情必须是动态地根据用户的操作刷新。

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

回答

3

这是一个常见的误解。当DependencyProperty的值发生变化时,其CLR属性的set中的代码不会执行。如果您想在属性值更改时执行某些代码,则需要使用PropertyChanged回调。

你的用户控件的代码看起来应该是这样,而不是:

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); 
    } 
} 
+0

感谢您给我们! – cdie

+0

不客气! – almulo