ListView не показывает данные из ViewModel, когда ViewModel инициализируется в коде позади - PullRequest
0 голосов
/ 08 января 2020

Я новичок в WPF и все еще немного запутался, как работает привязка. По сути, у меня есть список, который не обновляется, если я заново инициализирую ViewModel:

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

<!-- ... -->

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

Когда Window загружается в первый раз, вызывается ViewModel и выбирает данные из базы данных. Хорошо, до здесь.

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

У меня есть метод в представлении, который снова инициализирует ViewModel, чтобы перезагрузить новые данные из базы данных:

vm = new MyViewModel();

Однако новые данные не будут отображается автоматически в ListView, если я не укажу DataContext из ListView в коде после повторной инициализации ViewModel.

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

Я немного запутался, мне нужно явно установить DataContext, как я и думал, указав ViewModel в файле xaml, под ресурсами окна, будет вызывать привязку данных к модели представления при каждой инициализации?

Спасибо!

1 Ответ

1 голос
/ 08 января 2020

Сначала создается объект vm1, который помещается в контекст данных представления. Когда vm1 помещается в контекст данных представления, тогда представление связывается с vm1.

Когда данные обновляются, объект vm2 создается с обновленными данными. Но представление связывается с данными vm1, тогда представление отображает старые данные vm1.

Когда vm2 помещается в контекст данных представления, тогда представление связывается на vm2, и в представлении отображаются обновленные данные vm2.

Как говорит @ canton7 в комментарии, без веской причины лучше обновить данные в vm1, чтобы обновить представление. В MVVM вы связываете (помещаете в контекст данных) View с ViewModel и работаете только с ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...