【问题标题】:Binding class object to listview in wpf将类对象绑定到wpf中的listview
【发布时间】:2012-04-30 06:46:52
【问题描述】:

我在 wpf 中创建了一个用户控件,它由一个文本框和一个列表视图组成。现在,我想将一个类对象从我将使用此控件的表单绑定到列表视图。所以,基本上我想动态设置列表视图的绑定。

这可能很简单,但我是 wpf 的新手,这对我来说是一项艰巨的任务。请为此提出解决方案。

【问题讨论】:

    标签: c# wpf vb.net listview data-binding


    【解决方案1】:

    您需要将ListViewItemsSource 属性绑定到您的类实例的集合(我建议为此使用ObservableCollection)。例如,您可以将集合放入ListViewDataContext。然后绑定将只是

    <ListView ItemsSource={Binding} .../>
    

    创建一个类来包含此集合以及您的UserControl 可能需要的任何其他对象并将此类的实例传递给UserControlDataContext 会更有用。这是指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 类实例,其中包含产品集合。达达! :)

    【讨论】:

    • 能否提供一些示例代码来设置 DataContext。设置 DataContext 后,ItemsSource={Binding} 会处理绑定吗?
    • 非常感谢您的回答。这是我见过的最简单优雅的解决方案。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多