繁体   English   中英

使用 MVVM 模式绑定 ListView

[英]Binding ListView using MVVM pattern

我正在尝试将 ListView 控件与视图模型中的 List 绑定。 它不起作用,我在stackoverflow中找到了那个线程: MVVM Pattern Listview ,并按照我在 ObservableCollection 上更改了 List 的答案。 编译后我可以将新对象添加到列表视图,但它们是空的,尽管我在命令中将它们设置为默认值。 我做错了什么? 如何正确绑定我的收藏?

XAML 代码:

        <ListView Grid.ColumnSpan="5" Grid.RowSpan="4" x:Name="ProductListView" ItemsSource="{Binding Products}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Products" DisplayMemberBinding="{Binding Path=Name}" />
                </GridView>
            </ListView.View>
        </ListView>

<Button Grid.Row="0" Grid.Column="5" Content="Add" Command="{Binding AddProduct}" />

视图模型代码:

        public MainViewModel(MainWindow view)
        {
            model = new MainModel();
            this.view = view;

            Products = new ObservableCollection<Product>();
            Products.Add(new Product() { Name="Example"});
        }

        public ObservableCollection<Product> Products
        {
            get => model.Products;

            set
            {
                model.Products = value;
                OnPropertyChanged(nameof(Products));
            }
        }


        public ICommand AddProduct
        {
            get
            {
                addProduct = new RelayCommand((object o) => {

                    Products.Add(new Product() { Name="New product"} );

                }, null);

                return addProduct;
            }
        }

型号代码:

internal ObservableCollection<Product> Products = new ObservableCollection<Product>();

我建议您删除 Products 属性的设置器: public ObservableCollection<Product> Products 问题是当您在绑定完成后分配它时,您会将项目添加到不同的集合中。

改用这个:

public ObservableCollection<Product> Products { get; } = 
    new ObservableCollection<Product>();

这个this.view = view; 我不知道。 应该是this.DataContext = view; ?


凭借我对 MVVM 的(中级)知识:

  • View 绑定到 ViewModel 的数据
  • ViewModel 持有数据结构(也是创建 ObservableCollections 的所有者)
  • Model 使用 ViewModel 中的数据来操作数据。 (因此间接地查看)

所以把public ObservableCollection<Product> Products { get; } = new ObservableCollection<Product>(); public ObservableCollection<Product> Products { get; } = new ObservableCollection<Product>(); 在 ModelView 而不是模型中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM