2016-06-01 4 views
0

J'ai une application wpf/C# .; J'ai une zone de liste et selon l'élément sélectionné, j'affiche une certaine vue. J'ai une vue pour tous et différentes valeurs affichées. La vue ressemble à ceci:WPF - Contenu de deux contrôles utilisateur liés à la même instance de contrôle

<UserControl.Content> 
    <Binding Path="DisplayControl" UpdateSourceTrigger="PropertyChanged"/> 
</UserControl.Content> 

Le DisplayControl est un UserControl dans la vue Modèle de la boîte de liste (je sais que ce n'est pas le meilleur mais ne peux pas changer pour l'instant). Il est partagé entre tous les éléments de la liste. Le dernier élément de la liste (le dernier élément pour lequel la propriété du jeu DisplayControl a été appelée) est celui qui affiche la vue lorsqu'il est cliqué - tous les autres sont vides.

Quel est le problème? Ils sont liés de la même manière, pourquoi le dernier n'affiche que le contrôle et comment puis-je résoudre ce problème?

+0

Je ne comprends pas whay est votre objectif. Voulez-vous changer le contenu lié à selecteItem de la ListBox? – pix

+0

Oui. Mais il doit s'agir d'un point de vue et non d'un modèle de vue. Je comprends que ce n'est pas la bonne façon, mais il ne peut pas être changé pour le moment –

+0

Pouvez-vous s'il vous plaît nous montrer le ViewModel lié à votre vue? – pix

Répondre

1

Je pense que vous devriez essayer quelque chose comme ceci:

ViewModel.cs

public TypeModel 
{ 
    private string _label; 
    public string Label{ MVVM stuff} 

    private UserControl _userControl; 
    UserControl UserControl { MVVM stuff } 
} 

public class toto 
{ 
private ObservableCollection<TypeModel> _list; 
public ObservableCollection<TypeModel> List 
{ 
get{return this._list;} 
set { set value and notifyPropertyChanged } 
} 

private TypeModel _selectedItem; 
public TypeModel SelectedItem 
{ 
get{ return this._selectedItem;} 
set { set value and NotifyPropertyChanged } 
} 

} 

Dans votre view.xaml

<listbox normal binding to List + selectedItem binding> 
<ContentControl Binding={SelectedItem.UserControl} > 

Ceci est seulement le code de pseudo, essayez de coller à votre code existant comme ceci :)

Btw: @Ed Plunkett a raison.

+0

Ceci est solide, mais je pourrais souhaiter que vous ayez mis les bits de pseudocode comme 'MVVM Stuff' dans/**/comments, pour plus de clarté. –

+0

Je l'ai fait très rapidement du bureau. Je vais l'éditer plus tard :) – pix

+0

Merci. Ce serait une bonne solution pour cette situation.J'ai fini par changer la propriété DisplayControl à null pour l'élément sélectionné précédent chaque fois que l'élément sélectionné a été modifié, de sorte qu'un seul élément de liste à la fois aurait le contrôle lié. Je vais marquer ça comme la réponse car je pense que c'est mieux que ma solution qui n'a été choisie qu'à cause des contraintes. –

4

Un contrôle dans WPF ne peut avoir qu'un seul parent à la fois. En fait, il ne peut être que dans un seul lieu en même temps. Vous donnez DisplayControl deux parents différents en succession rapide. Le deuxième est où il finit.

Qu'est-ce que vous essayez réellement de accomplir ici? En termes de spécification de programme, pas "J'essaie de battre un clou avec un chien vivant parce que le gâteau d'anniversaire n'a pas fonctionné comme une pelle". Souhaitez-vous que le contenu de DisplayControl soit affiché dans deux endroits différents à la fois? C'est faisable.

De toute façon, la première chose à faire est de ne pas stocker de UserControls dans votre viewmodel. Cela peut et doit changer. Vous mettez du contenu dans le UserControl, n'est-ce pas? C'est pour ça, n'est-ce pas? Vous avez donc le contenu dans votre viewmodel et l'affichez dans un ou plusieurs UserControls dans la vue à l'aide d'un modèle.

Plus vous gaspillerez de temps à essayer de faire fonctionner le cauchemar de ce plombier, plus ce sera pire. Le Sunk Cost Fallacy n'est pas votre ami. Mais pour la plupart des gens, il n'y a qu'une seule façon d'apprendre cela.

+0

Je ne pouvais pas être plus d'accord. Malheureusement, ce n'est pas ma décision de changer toute la vue et de voir le modèle, sinon je le ferais. Merci pour votre réponse. –