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

时间:2019-02-27 15:19:09

标签: c# wpf data-binding wpf-controls observablecollection

我有以下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的{​​{1}}中来使其更小,更容易管理,并使用以下代码进行调用:

MissingValuesListView

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

<local:MissingValuesListView></local:MissingValuesListView> 后面的代码仅包含MissingValuesListView

我认为这没有任何意义(因为代码在主xaml文件的一部分中有效,但在移至UserControl时无效),但是DataContext = new MyViewModel();MyViewModel的实现{{1 }}。

我的问题是为什么这不起作用?我以为我缺少一些代码或某些绑定,但是我无法找出原因。非常感谢您的帮助!

1 个答案:

答案 0 :(得分: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属性是从其父元素定义的,并且绑定应该像以前一样工作。