Entwickler-Ecke

WPF / Silverlight - Dependency Properties in einem Objekt zusammenfassen?


relapse - Di 31.07.12 12:57
Titel: Dependency Properties in einem Objekt zusammenfassen?
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)

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


2) View (XAML)

C#-Quelltext
1:
Wert="{Binding Path=Wert, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"                    


3) UserControl

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

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

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.


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


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?


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

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