2010-04-23 10 views
3

Je peux utiliser la liaison de données pour définir le contenu initial d'un cadre WPF, mais les modifications ultérieures apportées à la propriété bound (implémentée à l'aide de INotifyPropertyChange) ne semblent pas modifier le contenu.Pouvez-vous utiliser la liaison de données avec la propriété Content d'un cadre WPF?

De même, est-ce que quelqu'un sait si la liaison directe à la propriété Content de cette manière fera apparaître l'élément lié dans le journal de Frame ou NavigationWindow?

Quelque contexte: Je me rends compte que je devrais probablement utiliser le NavigationService pour interagir avec le Frame, mais j'essaie de suivre le modèle MVVM. Il semble qu'il serait beaucoup plus simple de créer une base de données vers la propriété Content ...

Répondre

3

Beaucoup de membres de la communauté WPF sont d'avis que le cadre de navigation intégré est défectueux. Cependant, même si vous l'utilisiez, la liaison de la propriété Content n'est pas la bonne approche. Si vous souhaitez utiliser MVVM avec navigation, vous devez le combiner avec le modèle FrontController dans lequel ViewModel envoie une requête de navigation à un contrôleur qui résout ensuite cette requête pour vous. Il n'y a pas beaucoup d'exemples de ce concept disponible parce que (comme je l'ai déjà mentionné) de nombreux développeurs utilisent la navigation intégrée de WPF.

Si vous souhaitez consulter un moteur de navigation très robuste pour WPF, look at nRoute Il s'agit d'un port du moteur de routage MVC vers WPF.

0

Le cadre étant un hôte de navigation, il est plus correct d'utiliser NavigationService pour naviguer vers un contenu différent. Si vous utilisez le INotifyPropertyChange, je suppose que vous appelez l'événement lié chaque fois que le contenu est modifié. Ensuite, je suppose aussi qu'il n'y a pas de difficulté à utiliser le NavigationService à la place.

5

Vous pouvez utiliser la liaison de données sur un cadre, mais vous devez vous assurer que le mode de liaison est défini sur TwoWay.

XAML:

<Frame Content={Binding Path=MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} /> 

Voir Modèle:

public class MyViewModel : INotifyPropertyChanging, INotifyPropertyChanged 
{ 
    public Page MyProperty 
    { 
    get 
    { 
     return _viewModelPage; 
    } 

    set 
    { 
     this.OnPropertyChanging("MyProperty"); 
     _viewModelPage = value; 
     this.OnPropertyChanged("MyProperty"); 
    } 
    } 
} 
0

Je suis tombé sur cette question il y a quelques jours. J'avais une fenêtre principale avec un cadre, et j'ai chargé différentes pages dans le cadre (en utilisant Navigate()). Les liaisons de données des pages ont été rompues, les données n'apparaissaient pas sur la page chargée.

Pour réparer les liaisons, créez ou attribuez votre DataContext existant à la page à l'intérieur du cadre et les liaisons fonctionneront à nouveau.