2017-06-30 1 views
-1

Ich habe ein Problem mit der Bindung einer gemeinsamen Eigenschaft, die in mehreren ViewModels verwendet werden sollte.Wie verbindest du gemeinsame Eigenschaften in Multi ViewModels?

In meinem ersten MainViewModel verbinde ich mit der Datenbank, die Liste der Völker zurückgibt.

private async void Connected() 
{ 
    try 
    { 
     base.Peoples = await DatabaseConnection.GetAllPersonsCommandAsync(); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Auf dem zweiten Blick Ich möchte diese Daten angezeigt werden, indem sie sie an Peoples Bindung:

<ListView Width="200" 
    Margin="0 20 0 0" 
    HorizontalAlignment="Left" 
    ItemsSource="{Binding Peoples}" 
    cm:Message.Attach="[Event SelectionChanged] = [Action Peoples_SelectionChanged($source)];"> 

Ich Bindung Peoples meiner ViewModelBase:

private List<Person> _peoples; 
public List<Person> Peoples 
{ 
    get => _peoples; 
    set => OnPropertyChanged(ref _peoples, value); 
} 

Ich möchte Verwenden Sie diese Liste von Peoples in anderen ViewModel, die von ViewModelBase erben (wie MainViewModel).

Ich hoffe, die Frage ist für Sie verständlich.

Grüße

==== aktualisieren.

Das ist mein OnPropertyChanged Methode:

public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged<T>(ref T property, T value, [CallerMemberName]string propertyName = "") 
    { 
     property = value; 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

===== zweite Update

ich etwas getestet, und als ich schuf neue Person wie folgt aus:

private ObservableCollection<Person> _peoples = new ObservableCollection<Person>{ 
    new Person("aa", "aa", 1, 1) 
}; 
public ObservableCollection<Person> Peoples 
{ 
    get => _peoples; 
    set => OnPropertyChanged(ref _peoples, value); 
} 

Ich kann sie sehen. Irgendwelche Lösungen?

+2

Und wo ist dein Problem? Was funktioniert nicht wie erwartet? Was hast du bisher versucht? –

+0

Es funktioniert nicht. Ich bekomme Daten von 'DatabaseConnection.GetAllPersonsCommandAsync();', aber es gibt keine Änderungen in meiner Ansicht. – striker

+1

Zeigen Sie uns den Code in der OnPropertChanged() Methode. Wird das PropertyChanged-Ereignis tatsächlich ausgelöst? –

Antwort

1

Verwenden Sie bitte eine ObservableCollection<Person>, um Änderungen zu füllen. Initialisieren Sie es auch nicht neu - verwenden Sie stattdessen Clear() und Add(). Sie haben jetzt auch ein CollectionChanged Ereignis, das Sie damit verwenden können.

Wenn dies nicht funktioniert - bitte überprüfen Sie, ob Ihr DataContext richtig ist.

Bitte gehen Sie wie folgt aus:

public ObservableCollection<Person> Peoples 
    { 
     get; 
    } 

    public MyConstructor() 
    { 
     Peoples = new ObservableCollection<Person>(); 
    } 

    public void RefreshPeopleCollection(IEnumerable<Person> persons) 
    { 
     Peoples.Clear(); 

     foreach(var person in persons) 
     { 
      Peoples.Add(person); 
     } 
    } 
+0

Das ist ein guter Rat, aber ich bin mir nicht sicher, es ist die Antwort auf sein Problem. Das Einstellen einer Liste sollte in diesem Beispiel gut funktionieren. Er sieht möglicherweise keine Updates, sollte jedoch die ursprüngliche Liste sehen. –

+0

ObservableCollection funktioniert nicht – striker

+0

Idk was seine 'AttachedProperty' tut, aber gehen mit' List 'und reinitialisieren es - immer fühlt sich falsch in' XAML'. – Peter

Verwandte Themen