Autor Beitrag
Sestriel
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 25.06.15 09:32 
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:
ausblenden 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:

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 an.

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

Für diesen Beitrag haben gedankt: Sestriel
Sestriel Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 25.06.15 12:46 
Gilt in dem Fall mein Property des Model-Objektes, also mein
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Sestriel