Entwickler-Ecke

WPF / Silverlight - Binding auf ein Object [MVVM]


Sestriel - Do 25.06.15 09:32
Titel: Binding auf ein Object [MVVM]
Guten Morgen,


ich habe aktuell ein Projekt, für welches ich in WPF das MVVM-Pattern benutzen muss(Was nicht gerade einfach ist, wenn man vorher nie mit WPF o.ä gearbeitet hat :D .
Nun habe ich ein Problem, ich muss an eine ComboBox ein Objekt binden bzw die Property des Objektes.
Laut Google geht dies relativ einfach via <ComboBox ItemsSource="{Binding location.name, UpdateSourceTrigger=PropertyChanged}"[...], jedoch scheint dies bei mir nicht so recht zu wollen.

Hier mal ein paar Ausschnitte aus meinem Code.

XAML des Controls:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
x:Class="StandortbeschreibungNEW.Controls.ucStandortControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"             
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:myViewModels="clr-namespace:StandortbeschreibungNEW.ViewModels"
             d:DataContext="{d:DesignInstance myViewModels:vmStandort}"
             mc:Ignorable="d"
             d:DesignHeight="300"
             d:DesignWidth="300">


    <Grid>        
        <ComboBox ItemsSource="{Binding location.name, UpdateSourceTrigger=PropertyChanged}"  
                  x:Name="comboBox"
                  HorizontalAlignment="Left"
                  Margin="170,10,0,0"
                  VerticalAlignment="Top"
                  Width="200"
                  SelectedValuePath="{Binding /}" />
    </Grid>

</UserControl>


Der relevante Teil des Models:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
public class mStandort : Model
    {

        
        private string _name = "Hallo";
        public string name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged(() => name);
            }
        }


und hier ein Ausschnitt aus der ViewModel


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public class vmStandort : ViewModel
    {
        
        //Konstruktor
        public vmStandort()
        {
            init();
            mStandort location = new mStandort();//Instanz des Objektes mStandort.
            location.name = "Gr. Standortbeschreibung";
        }

        private void init()
        {          
            LoadHeadNodes(); //lade headnodes.
            if (HeadNodes != null)
            {
                LoadChildNodes(HeadNodes); //lade Childnodes, falls HeadNodes bereits geladen wurden.
            }          
            
        }
[...]
   }


Hoffe mir kann jemand weiterhelfen,

MfG

Ps: Alles zur Entwicklung grafischer Oberflächen mit der Windows Presentiation Foundation (Windows.Controls-Namespace), XAML, Silverlight, XBAP - Das markierte "i" ist zu viel, sorry :shock:


Th69 - Do 25.06.15 11:50

Hallo und :welcome:

so einfach geht das nun auch wieder nicht. ;-) Das Binding funktioniert nicht mit lokalen Variablen, sondern nur mit öffentlichen Eigenschaften (public properties)!

Du mußt also zum einen das ViewModel als DataContext entweder des Windows oder der ComboBox setzen und dann als zweites eine Eigenschaft definieren, welche die Liste bereitstellt (und diesen Eigenschaftennamen gibt du dann beim Binding an). Hinzu kommt, daß du dann in der Eigenschaft die INotifyPropertyChanged-Schnittstelle aufrufen mußt. Schau dir mal den ersten Artikel in meinen Beitrag zu Binding aktualisiert nicht [http://www.entwickler-ecke.de/viewtopic.php?p=694628#694628] an.

PS: Danke für das Melden des Rechtschreibfehlers - habe es im Team weitergegeben.


Sestriel - Do 25.06.15 12:46

Gilt in dem Fall mein Property des Model-Objektes, also mein

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public string name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged(() => name);
            }
        }

also die öffentliche Eigenschaft?
Denn dort habe ich ja sowohl die INotifyPropertyChanged-Schnittstelle genutzt, als auch eine rückgabe des aktuellen Wertes.

Edit: Ich habe in den letzten Stunden meinen Code um einiges erweitert.
Nun wird eine ObservableCollection mit x-Objekten(Abhängig von der XML Datei) gefüllt und diese Objekte sind ebreits mit Daten gefüllt.

Moderiert von user profile iconTh69: Full Quote entfernt.


Ralf Jansen - Do 25.06.15 13:12

Du bindest View und ViewModel nicht das Model. Wenn es eine direkte Bindung zwischen View und Model gäbe wäre das Viewmodel ja auch eher überflüssig :gruebel:
Also nein die Property am Model hilft dir hier nicht nur beim kommunizieren zwischen ViewModel und Model.