2016-06-01 9 views
0

Ich habe eine wpf/C# -Anwendung .; Ich habe ein Listenfeld und je nach ausgewähltem Element zeige ich eine bestimmte Ansicht an. Ich habe eine Ansicht für alle und verschiedene Werte angezeigt. Der Blick sieht wie folgt aus:WPF - Inhalt von zwei Benutzersteuerelementen, die an dieselbe Instanz des Steuerelements gebunden sind

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

Die Displaycontrol ist ein Benutzersteuerelement in der Ansicht Modell des List-Feldelement (ich weiß, es ist nicht die beste, aber das kann jetzt nicht ändern). Es wird für alle Listbox-Elemente freigegeben. Das letzte Listboxelement (das letzte, für das die DisplayControl-Set-Eigenschaft aufgerufen wurde) ist dasjenige, das die Ansicht anzeigt, wenn darauf geklickt wird - alle anderen Felder sind leer.

Was ist das Problem? Sie sind auf die gleiche Weise gebunden, warum zeigt die letzte nur die Kontrolle an und wie repariere ich das?

+0

Ich verstehe nicht, was Ihr Ziel ist. Möchten Sie den Inhalt, der sich auf das selecteItem bezieht, von der ListBox ändern? – pix

+0

Ja. Aber es muss eine Bindung zu einem View und nicht zu einem View-Modell sein. Ich verstehe, dass dies nicht der richtige Weg ist, aber es kann im Moment nicht geändert werden. –

+0

Kannst du uns bitte das ViewModel zeigen, gebunden an deine Ansicht? – pix

Antwort

1

Ich glaube, Sie so etwas wie dies versuchen sollte:

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 } 
} 

} 

In Ihrem view.xaml

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

Dies ist nur Pseudo-Code, versuchen Sie, Ihre Stick bestehender Code wie folgt :)

Btw: @Ed Plunkett ist richtig.

+0

Das ist solide, aber ich könnte mir wünschen, dass Sie die Pseudocode-Bits wie 'MVVM Stuff' in/**/Kommentare zur Verdeutlichung gesetzt haben. –

+0

Ich machte das sehr schnell aus dem Büro. Ich werde es später bearbeiten :) – pix

+0

Danke. Es wäre eine gute Lösung für diese Situation.Am Ende änderte ich die DisplayControl-Eigenschaft für jedes Mal, wenn das ausgewählte Element geändert wurde, auf null für das zuvor ausgewählte Element. Auf diese Weise würde jeweils nur ein Listenfeldelement mit dem Steuerelement verknüpft werden. Ich werde dies als die Antwort markieren, da ich denke, dass es besser ist als meine Lösung, die nur wegen Beschränkungen ausgewählt wurde. –

4

Ein Steuerelement in WPF kann immer nur ein Elternteil haben. In der Tat kann es nur an einem Ort gleichzeitig sein. Sie geben DisplayControl zwei verschiedene Eltern in schneller Folge. Der zweite ist, wo es endet.

Was versuchen Sie eigentlich zu erreichen hier? In Programmspez ausgedrückt, nicht "Ich versuche, einen Nagel mit einem lebenden Hund zu schlagen, weil der Geburtstagskuchen nicht als Schaufel gearbeitet hat". Möchten Sie, dass der Inhalt von DisplayControl gleichzeitig an zwei verschiedenen Orten angezeigt wird? Das ist praktikabel.

Wie auch immer, der erste Auftrag besteht nicht darin, Benutzersteuerelemente in Ihrem Ansichtsmodell zu speichern. Das kann und muss sich ändern. Sie stellen irgendeinen Inhalt in das UserControl, oder? Dafür ist es da, oder? So haben Sie den Inhalt in Ihrem Ansichtsmodell, und zeigen Sie es in einem oder mehreren UserControls in der Ansicht unter Verwendung einer Vorlage an.

Je mehr Zeit man verschwendet, um den Albtraum dieses Klempners zum Funktionieren zu bringen, desto schlimmer wird es. Die Sunk Cost Fallacy ist nicht dein Freund. Aber für die meisten Menschen gibt es nur eine Möglichkeit, das zu lernen.

+0

Ich könnte mehr nicht zustimmen. Leider ist es nicht meine Entscheidung, das gesamte View- und View-Modell zu ändern, sonst würde ich es tun. Danke für deine Antwort. –