2010-05-17 4 views
0

j'ai écrit un prototype MVVM comme un exercice d'apprentissage et je suis mal à comprendre comment je peux communiquer entre views.Let me expliquerne semblent pas pouvoir communiquer entre les vues

J'ai un TreeView à gauche (leftSideView)

ListView à droite (rightSideView)

MainWindow (y compris les 2 vues mentionnées ci-dessus et un diviseur)

Ce que j'ai mis en place ne fonctionne pas et je voudrais que vous si vous pouvez indiquer où je suis aller wr ong ou s'il y a une meilleure façon de le faire. vous pouvez télécharger le prototype rapide d'ici

http://cid-9db5ae91a2948485.skydrive.live.com/self.aspx/.Public/WpfCommunicationBetweenViews.zip

Bien sûr que je fais quelque chose de mal avec le bindind. Aussi, ce serait bien d'apprendre comment vous le faites. EG ListBox à gauche (une vue) ListView À droite (autre vue), comment communiquez-vous entre les deux.

Merci beaucoup de suggestions

+0

Pourriez-vous marquer cela avec la langue appropriée? Aussi, si possible, pourriez-vous poster juste l'extrait pertinent, il serait plus facile de jeter un coup d'oeil rapide. – tylermac

+0

Merci pour votre réponse, Je ne savais pas combien d'extrait de mettre it.Sorry. J'ai commencé à les mettre et le poste est devenu si long.Je vais le marquer.J'ai MVVM et pensé approprié. – user9969

Répondre

2

Je pris un coup d'oeil à votre code, faites les modifications ci-dessous, et cela a fonctionné. J'ai changé la vue de droite pour avoir juste un bloc de texte pour le simplifier un peu.

MainWindow.xaml.cs (Créer un modèle de vue pour les deux vues de se lier à)

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public static ProtoViewModel MainViewModel = new ProtoViewModel(Repository.GetContinents()); 
} 

LeftSideView.xaml.cs (définir le contexte de données de ce point de vue être le modèle de vue et mettre à jour sélectionné ville du modèle de vue lorsque changé)

public partial class LeftSideView 
{ 
    public LeftSideView() 
    { 
     InitializeComponent(); 

     this.DataContext = MainWindow.MainViewModel; 
    } 

    /// <summary> 
    /// Update the selected city of the view model 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void OnTreeSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     (this.DataContext as ProtoViewModel).SelectedCity = e.NewValue as CityViewModel; 
    } 
} 

RightSideView.xaml.cs (régler la vue du côté droit d'utiliser le même modèle de vue)

public partial class RightSideView 
{ 
    public RightSideView() 
    { 
     InitializeComponent(); 

     this.DataContext = MainWindow.MainViewModel; 
    } 
} 

Dans le RightSideView.xaml, je viens de mettre la zone de texte qui est indiqué ci-dessous:

<TextBlock Text="{Binding SelectedCity.Details.City.Name}"/> 

Quand une ville sur la vue de gauche est sélectionné, il sera changé la ville sélectionnée sur le modèle de vue, par conséquent, il sera mis à jour le nom de la ville sélectionnée dans la vue de droite.

Voici ce que la classe ProtoViewModel ressemblait à:

public class ProtoViewModel : Core.ViewModelBase 
{ 
    public ProtoViewModel(IEnumerable<ContinentInfo> continents) 
    { 
     Continents = 
      new ReadOnlyCollection<ContinentViewModel>(
       (from continent in continents 
       select new ContinentViewModel(continent)).ToList()); 
    } 

    public ViewModels.CityViewModel SelectedCity 
    { 
     get { return selectedCity; } 
     set 
     { 
      if(selectedCity != value) 
      { 
       selectedCity = value; 
       OnPropertyChanged("SelectedCity"); 
      } 
     } 
    } 
    private ViewModels.CityViewModel selectedCity; 

    public ReadOnlyCollection<ContinentViewModel> Continents 
    { 
     get { return continents; } 
     set 
     { 
      if (continents != value) 
      { 
       continents = value; 
       OnPropertyChanged("Continents"); 
      } 
     } 
    } 
    private ReadOnlyCollection<ContinentViewModel> continents; 
} 

je partage les fichiers modifiés avec vous, mais je ne sais pas comment faire :)

+0

wow. Laissez-moi digérer et revenir vous.vous pourriez si vous voulez m'envoyer un courriel [email protected] mais ne pas s'inquiéter si un tracas. Je sais qu'il y a plusieurs façons de peler un chat, mais l'aurais-tu fait de cette façon? Juste essayer d'établir ce qui est la bonne façon. J'ai lu à propos de "Messenger" Mediator Pattern etc ... juste pas sûr de ce qui est une sorte de "meilleure pratique" si vous le souhaitez. – user9969

1

Vous pouvez également envisager d'utiliser un motif médiateur faiblement couplé.Voir par exemple:

Médiateur de Laurent Bugnion dans le Light Toolkit MVVM here

MVVM Fondation Messenger here

événement Aggregator here

ISuckLessEventAggregator Josh Twist de Prism here

Questions connexes