如何将 ObservableCollection 绑定到 UserControl 中的 ListView?
How to bind ObservableCollection to the ListView in a UserControl?
我有以下 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 文件变得太大,我想通过在名为 MissingValuesListView
的 UserControl
中提取此 ListView
并调用它使用以下代码:
<local:MissingValuesListView></local:MissingValuesListView>
但是,当添加新元素时,列表不再更新。
MissingValuesListView
后面的代码只包含DataContext = new MyViewModel();
.
我认为它没有任何相关性(因为代码在主 xaml 文件的一部分时有效,但在移至 UserControl 时无效),但 MyViewModel
和 MissingValue
实现 INotifyPropertyChanged
.
我的问题是为什么这不起作用?我假设我遗漏了一些代码或一些绑定,但我没有找到是什么。非常感谢任何帮助!
MissingValuesListView's code behind contains only 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
属性 是从其父元素定义的,绑定应该像以前一样工作.
我有以下 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 文件变得太大,我想通过在名为 MissingValuesListView
的 UserControl
中提取此 ListView
并调用它使用以下代码:
<local:MissingValuesListView></local:MissingValuesListView>
但是,当添加新元素时,列表不再更新。
MissingValuesListView
后面的代码只包含DataContext = new MyViewModel();
.
我认为它没有任何相关性(因为代码在主 xaml 文件的一部分时有效,但在移至 UserControl 时无效),但 MyViewModel
和 MissingValue
实现 INotifyPropertyChanged
.
我的问题是为什么这不起作用?我假设我遗漏了一些代码或一些绑定,但我没有找到是什么。非常感谢任何帮助!
MissingValuesListView's code behind contains only
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
属性 是从其父元素定义的,绑定应该像以前一样工作.