Jestem nowy w WPF i nadal jestem trochę zdezorientowany, jak działa wiązanie. Zasadniczo mam listę, która nie zostanie odświeżona, jeśli ponownie zainicjuję ViewModel:

<Window.Resources>
    <ViewModels:MyViewModel x:Key="myViewModel"/>

<!-- ... -->

<ListView x:Name="MyList" HorizontalContentAlignment="Stretch" 
          DataContext="{StaticResource myViewModel}"
          ItemsSource="{Binding Customers}"
          DockPanel.Dock="Top">

Gdy Window ładuje po raz pierwszy, zostanie wywołany i pobiera dane z bazy danych. Dobrze, do tej pory.

public class MyViewModel
{
    public ObservableCollection<CustomerModel> Customers { get; set; }

    public int HasWarnigs
    {
        get { return Customers.Where(a => a.HasWarning == true).Count(); }
    }

    public MyViewModel()
    {
        // fetch data.
        Customers = ...
    }
}

Mam metodę w widoku, który ponownie zainicjuje ViewModel, aby przeładować nowe dane z bazy danych:

vm = new MyViewModel();

Jednak nowe dane nie będą wyświetlane automatycznie w ListView, chyba że określę DataContext ListView, w kodzie za sobą, po ponownym inicjowaniu ViewModel.

vm = new AnswersViewModel();
MyListView.DataContext = vm;

Jestem trochę zdezorientowany, muszę wyraźnie ustawić DataContext, jak myślałem, określając ViewModel w pliku XAML, pod zasobami okna, spowodowałoby, że dane będą związane z modelem widoku za każdym razem To zostanie zainicjowane?

Dzięki!

-1
Leño77 8 styczeń 2020, 19:41

1 odpowiedź

Najlepsza odpowiedź

Najpierw utworzona jest obiekt vm1 i umieścić w kontekście danych widoku. Gdy vm1 jest umieszczony w kontekście danych widoku, widok jest wiążący do vm1.

Gdy dane są odświeżone, tworzony jest obiekt vm2 za pomocą odświeżonych danych. Ale widok jest wiążący z danymi vm1, a następnie widok wyświetla stare dane vm1.

Gdy vm2 jest umieszczony w kontekście danych widoku, to widok jest wiązanie z vm2 i widok wyświetla odświeżone dane vm2.

Jak @ Canton7 mówi w komentarzu, bez dobrego powodu, lepiej zaktualizować dane w vm1, aby zaktualizować widok. W MVVM link (umieść kontekst danych) Widok z Viewmodel i działa tylko z Viewmodel.

2
vernou 8 styczeń 2020, 16:53