【问题标题】:How to bind ObservableCollection to the ListView in a UserControl?如何将 ObservableCollection 绑定到 UserControl 中的 ListView?
【发布时间】:2019-02-27 15:19:09
【问题描述】:

我有以下 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&lt;MissingValue&gt; MissingValues。单击按钮后,项目被添加到此属性中,一切都按预期工作。

由于 xaml 文件变得太大,我想通过在名为 UserControlUserControl 中提取此 ListView 并使用以下代码调用它来使其更小且更易于管理:

<local:MissingValuesListView></local:MissingValuesListView>

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

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

我认为它没有任何相关性(因为代码在主 xaml 文件的一部分时有效,但在移至 UserControl 时无效),但 MyViewModelMissingValue 实现 INotifyPropertyChanged

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

【问题讨论】:

  • 缺失值在哪里?你确定里面有数据?当您移动列表视图时,您是否以某种方式丢失了 itemssource 绑定?这个新的用户控件是什么样的?
  • 不要在后面的代码中设置 UserControl 的 DataContext(到第二个视图模型实例)。它将自动从页面继承。通常,UserControl 永远不应显式设置其自己的 DataContext。它的子元素要么直接绑定到继承的 DataContext,要么绑定到控件公开的依赖属性。
  • @Clemens 你是对的,谢谢!这很有意义。

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


【解决方案1】:

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

不应该。尝试删除此行。您只需将以下 XAML 复制到 MissingValuesListView.xaml 并在当前 XAML 文件中将其替换为 &lt;local:MissingValuesListView /&gt;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2012-05-26
    • 2018-05-21
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多