2009-11-12 6 views
0

J'ai un contrôle utilisateur de navigation de données dans Silverlight qui ouvre une fenêtre enfant dans laquelle l'utilisateur peut entrer des critères de recherche et quand il appuie sur 'Appliquer', il est supposé mettre à jour la propriété ViewModel (motif MVVM.)Relier la propriété de dépendance Silverlight Custom Control à la propriété Modèle

Les liens sont: SearchDialog < -> DataNavigator < -> MyView < -> MyViewModel

La propriété de dépendance à SearchDialog semble fonctionner, quand je mis sa valeur, il apparaît dans DataNavigator; Toutefois, lorsque la propriété de dépendance change, aucune notification ne semble être envoyée par DataNavigator à MyView/MyViewModel.

SearchDialog dérive de 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 dérive de 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 dérive de 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 dérive de ViewModel :

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

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

J'ai essayé pendant des heures pour trouver le problème mais n'ai pas eu de succès; Quelqu'un voit-il le problème? Merci à l'avance,

+0

Le xaml pour ma vue est le DataNavigator? Est-ce la vue ou est le DataNavigator dans la vue? Je ne vois pas non plus de relation entre la propriété SearchString dans votre machine virtuelle et la liaison de recherche dans la vue (ou est-ce que DataNavigator?). – Bryant

+0

@Brian Je n'ai coupé que le morceau de MyView, je peux poster le reste mais cela ne semble pas pertinent à la question. Le paramètre de recherche de DataNavigator (je crois) est lié à SearchString dans la machine virtuelle et que (encore, je crois) est lié à la propriété de dépendance de SearchDialog.Je pourrais être déroutant quelque chose ici (nouveau aux PDD) ainsi si je suis, suggérez svp un changement que je pourrais faire. –

+0

Ok, je le vois maintenant. Pas sûr que cela fonctionnera puisque vous liez une chaîne à une liaison. Je pense que la propriété de recherche doit être une chaîne pour que cette liaison fonctionne. – Bryant

Répondre

0

Bryant's solution ressemble à la bonne façon de faire mais j'ai quand même eu quelques problèmes. J'ai fini par obtenir que cela fonctionne en utilisant l'approche suivante:

J'ai ajouté un événement SearchDialog qui déclenche chaque fois que le modèle de recherche DP changé:

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; 

Après cela, je viens d'ajouter un autre DP dans le 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)); 

Et puis accroché DP du navigateur DP du SearchDialog afin que les modifications à la propriété de recherche seraient propagées jusqu'à la DataNavigator qui est alors lié à la V & VM. Le reste des choses reste le même que ci-dessus et je reçois l'effet que je recherchais.

1

Vous ne savez pas si cette propriété Binding au milieu fonctionnera puisque vous essayez de lier à une propriété de type string.

Puisque vous utilisez déjà certains éléments de Nikhil, vous pouvez jeter un oeil à how he uses Tasks to handle dialogs/child windows tout en conservant le paradigme MVVM.

Questions connexes