Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Di 31.07.12 12:57 
Hi! Ist es möglich? Ich benutze MVVM-Pattern und im View habe ich einen UserControl (ein separates Projekt). Um die Daten zwischen UserControl und ViewModel auszutauschen, benutze ich Dependency Properties, die ich selbst im UserControl definiere und über View mit dem ViewModel verknüpfe. Da ich viele Properties brauche, ist die Schnittstelle viel zu "breit" geworden. Um sie schlank zu halten, bietet sich die Bündelung von mehreren Properties in einem einzigen Objekt. Hab' kein Beispiel dafür im Internet gefunden, deswegen frage ich hier.

Danke!

P.S.: So sieht's bei mir aus:

1) View (Code Behind)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        public View (IViewModel viewModel)
        {
            InitializeComponent();
            _viewModel = viewModel;
        }


2) View (XAML)
ausblenden C#-Quelltext
1:
Wert="{Binding Path=Wert, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"					


3) UserControl
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public static readonly DependencyProperty WertProperty = DependencyProperty.Register("Wert"typeof(double), typeof(MyUserControl), new PropertyMetadata(default(double)));

        public double Wert
        {
            private get { return (double)GetValue(WertProperty); }
            set { SetValue(WertProperty, value); }
        }


4) ViewModel
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        public double Wert
        {
            get { return _wert; }
            set
            {
                _wert = value;
                OnPropertyChanged(new PropertyChangedEventArgs("Wert"));
            }
        }
daeve
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: Di 31.07.12 14:42 
hmm.. also der Sinn des MVVM Pattern ist ja das du Pro View ein ViewModel hast, der Datenaustausch funktioniert mit Bindings auf die Properties in der ViewModel Klasse.
Diese Properties müssen dann das Interfase INotifyPropertieChanged implementieren.(hast du gemacht wie ich unten sehe)

Wenn die Bindings Funktionieren braucht du ja gar kein "Datenaustausch" das wird automatisch über das Binding gemacht.

in der View musst du noch den Datacontext setzten
ausblenden C#-Quelltext
1:
this.DataContext = mainViewModel;					


Ev. hilft dir ja auch eine Generische Liste, du machst einfach eine Klasse mit den Properties die du brauchst.
Dann erstellst du dir einfach eine Liste vom Typ deiner Klasse.
Diese Liste muss du als Propertie definieren und nacher darauf binden in der View.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private List<DeineListe> _nameListe; 
public List<DeineListe> NameListe 
        {
            get { return _nameListe; }
            set 
            {
                if (value != _nameListe)
                {
                    _nameListe = value;
                    NotifyPropertychanged("NameListe");
                }
            }
            
        }
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Di 31.07.12 16:15 
Aber wozu denn eine generische Liste? Kann ich nicht direkt eine eigene Klasse benutzen?

Zitat:
Diese Properties müssen dann das Interfase INotifyPropertieChanged implementieren.


Warum nicht so:

ausblenden C#-Quelltext
1:
2:
3:
4:
public class Person : INotifyPropertieChanged{
  public int alter { get; set; }
  public string nachname { get; set; }
}


Ich möchte ja nicht einzelne Properties, sondern ganze Objekte, die mehrere Properties enthalten, über DataBinding binden. Geht das ohne eine Liste?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private Person _person; 
public Person
        {
            get { return _person; }
            set 
            {
                if (value != _person)
                {
                    _person = value;
                    NotifyPropertychanged("Person");
                }
            }
            
        }
daeve
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: Di 31.07.12 17:19 
genau dafür sind doch listen da....und mit einer Generischen Liste kannst du dir deine EigenenProperties zusammenstellen.

wenn du die Liste hast kannst die Sie als Itemsoure z.B einer Listview angeben und einem Element der ListView Bindest du auf das Propertie in der Liste.

Nicht so weil: jedes Propertie in der Klasse das event der NotifyPropertyChanged aufrufen muss damit das GUI automatisch über das Binding aktualisiert wird.
Jedes Propertie in deiner Klasse Person muss so aufgebaut sein wie mein Beispiel.
ausblenden C#-Quelltext
1:
2:
3:
4:
public class Person : INotifyPropertieChanged{
  public int alter { get; set; }
  public string nachname { get; set; }
}