Привязка проблемы Свойство зависимости Silverlight Custom Control со свойством Model - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть пользовательский элемент управления для навигации по данным в Silverlight, который открывает дочернее окно, где пользователь может вводить критерии поиска, и когда они нажимают «Применить», предполагается обновить свойство привязки в ViewModel (шаблон MVVM.)

Ссылки: SearchDialog <-> DataNavigator <-> MyView <-> MyViewModel

Кажется, что свойство зависимости в SearchDialog работает, когда я устанавливаю его значение, оно отображается в DataNavigator; однако, когда свойство зависимости изменяется, кажется, что от DataNavigator к MyView / MyViewModel не отправляется уведомление.

SearchDialog наследуется от ChildWindow:

public string Search
{
 get { return (string)GetValue(SearchProperty); }
 set { SetValue(SearchProperty, value); }
}

public static readonly DependencyProperty SearchProperty =
 DependencyProperty.Register("Search", typeof(string), typeof(SearchDialog),
 new PropertyMetadata(null));

DataNavigator наследуется от UserControl:

public Binding Search { get; set; }

private void DataNavigator_Loaded(object sender, Windows.RoutedEventArgs e)
{
 if (Search != null)
  this._searchDialog.SetBinding(SearchDialog.SearchProperty, Search);
}

MyView является производным от SilverlightFX.UserInterface.Navigation.Page:

<DataNavigator MovePreviousAction="$model.MovePrevious()"
               CurrentIndex="{Binding CurrentIndex, Mode=TwoWay}"
               MoveNextAction="$model.MoveNext()"
               SaveAction="$model.SaveChanges()"
               IsLoading="{Binding IsLoading, Converter={StaticResource VisibilityConverter}}"
               Search="{Binding SearchString, Mode=TwoWay}"/>

MyViewModel наследуется от ViewModel:

public string SearchString
    {
     get { return this._search; }

  set
  {
   if(value != this._search)
   {
    this._search = value;
    this.RaisePropertyChanged("SearchString");
   }
  }
 }

Я часами пытался найти проблему, но безуспешно; кто-нибудь видит проблему? Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Не уверен, будет ли работать это свойство Binding в середине, поскольку вы пытаетесь связать его со свойством типа string.

Поскольку вы уже используете некоторые из материалов Nikhil, вы можете взглянуть на , как он использует задачи для обработки диалогов / дочерних окон , сохраняя при этом парадигму MVVM.

0 голосов
/ 13 ноября 2009

Решение Брайанта выглядит как правильный путь, но у меня все еще были некоторые проблемы. В конце концов я заставил это работать, используя следующий подход:

Я добавил событие в SearchDialog, которое будет срабатывать при изменении шаблона поиска DP:

public string Search
{
    get { return (string)GetValue(SearchProperty); }
    set { SetValue(SearchProperty, value); }
}

public static readonly DependencyProperty SearchProperty =
    DependencyProperty.Register("Search", typeof(string), typeof(SearchDialog),
    new PropertyMetadata(null, new PropertyChangedCallback(OnSearchChanged)));

private static void OnSearchChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // call to instance method
    ((SearchDialog)d).OnSearchChanged(e);
}

protected virtual void OnSearchChanged(DependencyPropertyChangedEventArgs e)
{
    if (SearchChanged != null)
        this.SearchChanged(this, e);
}

public event DependencyPropertyChangedEventHandler SearchChanged;

После этого я просто добавил еще один DP в DataNavigator:

public string Search
{
    get { return (string)GetValue(SearchProperty); }
    set { SetValue(SearchProperty, value); }
}

public static readonly Windows.DependencyProperty SearchProperty =
Windows.DependencyProperty.Register("Search", typeof(string), typeof(DataNavigator),
new Windows.PropertyMetadata(null));

А затем подключил DP навигатора к DP SearchDialog, чтобы изменения свойства Search распространялись на DataNavigator, который затем связывался с V & VM.

// Inside the Loaded Event:
this._searchDialog.SearchChanged +=
    new System.Windows.DependencyPropertyChangedEventHandler(Search_Changed);

// Handler:
private void Search_Changed(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
    string search = this._searchDialog.GetValue(SearchDialog.SearchProperty) as string;
    this.Search = search != null ? search.ToString() : null;
}

Остальные вещи остаются такими же, как указано выше, и я получаю эффект, который искал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...