【发布时间】:2012-04-30 06:46:52
【问题描述】:
我在 wpf 中创建了一个用户控件,它由一个文本框和一个列表视图组成。现在,我想将一个类对象从我将使用此控件的表单绑定到列表视图。所以,基本上我想动态设置列表视图的绑定。
这可能很简单,但我是 wpf 的新手,这对我来说是一项艰巨的任务。请为此提出解决方案。
【问题讨论】:
标签: c# wpf vb.net listview data-binding
我在 wpf 中创建了一个用户控件,它由一个文本框和一个列表视图组成。现在,我想将一个类对象从我将使用此控件的表单绑定到列表视图。所以,基本上我想动态设置列表视图的绑定。
这可能很简单,但我是 wpf 的新手,这对我来说是一项艰巨的任务。请为此提出解决方案。
【问题讨论】:
标签: c# wpf vb.net listview data-binding
您需要将ListView 的ItemsSource 属性绑定到您的类实例的集合(我建议为此使用ObservableCollection)。例如,您可以将集合放入ListView 的DataContext。然后绑定将只是
<ListView ItemsSource={Binding} .../>
创建一个类来包含此集合以及您的UserControl 可能需要的任何其他对象并将此类的实例传递给UserControl 的DataContext 会更有用。这是指MVVM 模式。
编辑
您可以在代码隐藏或 xaml 中设置 DataContext。假设我们有一个包含集合的类:
public class ViewModel
{
public ViewModel()
{
Products = new ObservableCollection<Product>()
{
new Product("book"),
new Product("chair"),
new Product("table"),
new Product("bookshelf"),
}
}
ObservableCollection<Product> Products { get; set; }
}
下面是如何在代码中设置UserControl的DataContext:
userControl.DataContext = new ViewModel();
其中 userControl 是您的 UserControl 的一个实例。
这是在 xaml 中的操作方法:
<UserControl ...
xmlns:vm="namespace_containing_class_ViewModel">
<UserControl.DataContext>
<!-- Following line instantiates the ViewModel class and calls its parameterless constructor -->
<vm:ViewModel />
</UserControl.DataContext>
...
<ListView ItemsSource="{Binding Products}"/>
...
</UserControl>
两种变体的作用完全相同。请注意,ItemsSource="{Binding Products}" 表示 Binding.Path 属性设置为“Products”,并且将在 ListView 的 DataContext 中搜索此路径。如果 ListView 的 DataContext 没有显式设置(如上面提到的情况),它的 DataContext 与它的 Parent 的 DataContext 相同。如果未设置父级的 DataContext - 那么它与父级的父级 DataContext 相同,依此类推。因此在这种情况下,ListView 的 DataContext 与 UserControl 的 DataContext 相同,并且是一个 ViewModel 类实例,其中包含产品集合。达达! :)
【讨论】: