2015-06-17 7 views
1

Я пытаюсь сделать простой привязку OneWay для пользовательского элемента управления, но я честно не понимаю, почему некоторые части не работают. Чтобы быть простым, я создал стандартный UserControl WPF с некоторыми свойствами зависимостей. В моем главном окне я скрываю/показываю UserControl в зависимости от некоторых событий, и я привязываю свойства к моим данным в режиме просмотра главного окна. Тем не менее, это делает НЕ мой обновленный UserControl для некоторых частей. Для exampl, у меня есть свойство зависимостей в SearchString на моем UserControl:Как связать и обновить привязку UserControl в WPF?

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 член моего главного окна ViewModel

<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 в моей главной видовой схеме окна, значение установлено. Однако, когда я помещаю точку останова в набор моего SearchString в UserControl, он никогда не срабатывает?

Кроме того, DataContext моего UserControl установлено:

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

Я точен, что мой UserControl конструктор вызывается только один раз при запуске, другие вещи, которые должны быть динамически обновлять в зависимости от действий пользователя.

Есть ли у кого-то идеи? У меня нет ошибок в окне вывода Спасибо

ответ

3

Это распространенное заблуждение. Когда значение 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); 
    } 
} 
+0

Благодарим Вас за это! – cdie

+0

Добро пожаловать! – almulo

Смежные вопросы