如何将ObservableCollection绑定到UserControl中的ListView?

问题描述 投票:0回答:1

我有以下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文件变得太大,我想通过在名为ListViewUserControl中提取此MissingValuesListView并使用以下代码调用它来使其更小且更易于管理:

<local:MissingValuesListView></local:MissingValuesListView>

但是,添加新元素时不再更新列表。

MissingValuesListView的代码背后只包含DataContext = new MyViewModel();

我不认为它有任何相关性(因为代码在主要xaml文件的一部分时起作用,但在移动到UserControl时不起作用),但MyViewModelMissingValue implment INotifyPropertyChanged

我的问题是为什么这不起作用?我假设我缺少一些代码或一些绑定,但我没有找到什么。任何帮助都非常感谢!

c# wpf data-binding wpf-controls observablecollection
1个回答
1
投票

MissingValuesListView的代码仅包含DataContext = new MyViewModel();

它不应该。尝试删除此行。您只需将以下XAML复制到MissingValuesListView.xaml中,并将其替换为当前XAML文件中的<local:MissingValuesListView />

<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属性是从其父元素定义的,绑定应该像以前一样工作。

© www.soinside.com 2019 - 2024. All rights reserved.