C# 如何将ObservableCollection绑定到UserControl中的ListView?
我有以下xaml文件:C# 如何将ObservableCollection绑定到UserControl中的ListView?,c#,wpf,data-binding,wpf-controls,observablecollection,C#,Wpf,Data Binding,Wpf Controls,Observablecollection,我有以下xaml文件: <Page ...> <Grid> <ListView ItemsSource="{Binding MissingValues}"> <ListView.View> <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Information on Missing Values"
<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>
并且MyViewModel
在构造函数中初始化了public observeablecollection MissingValues
。在单击按钮时,项目将添加到此属性,并且所有内容都将按exptected方式工作
由于xaml文件变得太大,我希望通过在名为MissingValuesListView
的UserControl
中提取此ListView
并使用以下代码调用它,使其更小、更易于管理:
<local:MissingValuesListView></local:MissingValuesListView>
但是,添加新元素后,列表将不再更新
MissingValuesListView
的代码隐藏仅包含DataContext=new MyViewModel()代码>
我不认为这有任何关系(因为代码在作为主xaml文件的一部分时工作,但在移动到UserControl时不工作),但是MyViewModel
和MissingValue
ImplementINotifyPropertyChanged
我的问题是为什么这不起作用?我假设我丢失了一些代码或绑定,但我没有找到什么。非常感谢您的帮助
MissingValuesListView的代码隐藏仅包含DataContext=new MyViewModel()代码>
不应该。尝试删除此行。您只需将以下XAML复制到MissingValuesListView.XAML
中,并在当前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
属性是从其父元素定义的,绑定应该像以前一样工作。MissingValues在哪里?你确定里面有数据吗?移动listview时是否丢失了itemssource绑定?这个新的usercontrol看起来像什么?不要在其代码隐藏中设置usercontrol的DataContext(到第二个视图模型实例)。它将自动从页面继承。通常,UserControl永远不应该显式设置自己的DataContext。它的子元素要么直接绑定到继承的DataContext,要么绑定到控件公开的依赖属性。@Clemens你说得对,谢谢!这很有道理。
<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>