Как связать ObservableCollection с ListView в UserControl? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть следующий файл xaml:

<Page ...>
    <Grid>
        <ListView ItemsSource="{Binding MissingValues}">
            <ListView.View>
                <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Information on Missing Values">
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Element.Name}" Header="Element" Width="100" />
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Description}" Header="Description" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

Код только:

DataContext = new MyViewModel();

И MyViewModel имеет public ObservableCollection<MissingValue> MissingValues, инициализированный в конструкторе.При нажатии кнопки элементы добавляются к этому свойству, и все работает как показано.

Поскольку файл xaml стал слишком большим, я хотел уменьшить его и упростить управление, извлекая этот ListView в UserControl вызывает MissingValuesListView и вызывает его, используя следующий код:

<local:MissingValuesListView></local:MissingValuesListView>

Однако список больше не обновляется при добавлении новых элементов.

MissingValuesListView кодпозади содержит только DataContext = new MyViewModel();.

Я не думаю, что это имеет какое-либо значение (так как код работает, когда часть основного файла xaml, но не при перемещении в UserControl), но оба MyViewModel и MissingValue implment INotifyPropertyChanged.

Мой вопрос: почему это не работает?Я предполагаю, что мне не хватает некоторого кода или какой-либо привязки, но я не смог выяснить что.Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 28 февраля 2019

Код MissingValuesListView содержит только DataContext = new MyViewModel();.

Не должно.Попробуйте удалить эту строку.Вам следует просто скопировать следующий XAML в MissingValuesListView.xaml и заменить его на <local:MissingValuesListView /> в текущем файле XAML:

<ListView ItemsSource="{Binding MissingValues}">
    <ListView.View>
        <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Information on Missing Values">
            <GridViewColumn DisplayMemberBinding="{Binding Path=Element.Name}" Header="Element" Width="100" />
            <GridViewColumn DisplayMemberBinding="{Binding Path=Description}" Header="Description" />
        </GridView>
    </ListView.View>
</ListView>

Если вы сделаете это, UserControl унаследует DataContext, гдеMissingValues свойство определяется из его родительского элемента, и привязка должна работать так же, как и раньше.

...