Почему мой ListView ItemsSource имеет значение null (приложение uwp C#)

Я пытаюсь привязать List в моей ViewModel к ListView на моей странице, но не могу заставить его работать, ItemsSource всегда пуст, хотя список заполнен значениями.

Вот как я все это настроил.

эти атрибуты добавляются в тег страницы в моем xaml

xmlns:viewmodels ="using:TimeMachine3.ViewModels"
d:DataContext="{d:DesignInstance viewmodels:MasterViewModel}"

Мой LisstView определяется как

<ListView x:Name="lstMainMaster" ItemsSource="{Binding MyList}" SelectionChanged="lstMainMaster_SelectionChanged">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{x:Bind Name}"/>
                    <TextBlock Text="{x:Bind Number}"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

В моем master.cs (код страницы) у меня есть

    private ViewModels.MasterViewModel viewmodel;

    //constructor
    public master()
    {
        this.InitializeComponent();
        this.Loaded += Master_Loaded;
    }

    private void Master_Loaded(object sender, RoutedEventArgs e)
    {
        viewmodel = new ViewModels.MasterViewModel();
        viewmodel.populate();
    }

И в masterViewmodel (viewmodel страницы) у меня есть этот код

    private ObservableCollection<Month> _myList;
    public ObservableCollection<Month> MyList{ get {return _myList; } }

    public void Populate()
    {
        _myList = new ObservableCollection<Month>(DataBase.GetMonths(2017));
    }

2 ответа

Решение

Я только что понял, что мне не нужно реализовывать интерфейс InotifyChanged, если мой DataContext настроен правильно.

Я изменил способ установки контекста данных из

xmlns:viewmodels ="using:TimeMachine3.ViewModels"
enter code here`d:DataContext="{d:DesignInstance viewmodels:MasterViewModel}"

к

<Page
...
xmlns:viewmodels ="using:TimeMachine3.ViewModels"
.../>
<Page.DataContext>
   <viewmodels:MasterViewModel>
</Page.DataContext>

И теперь источник данных будет установлен сразу после вызова InitializeComponent(), и если мой список будет изменен, мой ListView обновится без добавления дополнительного кода (мне даже не нужно реализовывать INotifyChanged)

Это ноль, потому что вы измените ссылку, которая MyList указывает на то, что вы загрузили представление и не уведомляете представление об изменении (через INotifyPropertyChanged). Следовательно, представление не знает, что необходимо обновить привязку.

public void Populate()
{
    _myList = new ObservableCollection<Month>(DataBase.GetMonths(2017));
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyList)));
}

Или эквивалент.

Другие вопросы по тегам