MVVM 中的数据绑定 ObservableCollection

2024-01-23

我有一个带有数据模板的 ListView,其中包含电影列表。它被数据绑定到 ObservableCollection,但每当我编辑 Movie.Name 时,即使在我的 PropertyChangedEventHandler 中使用“Name”调用“Name”,它也不会更新 ListView。

我在初始化程序中将 2 个“电影”添加到我的收藏中,并且这些显示正确(Klovn 电影,拍摄)

因此,当我单击“编辑”时,它应该更改所选电影的文本并将其名称更改为“测试”,并且是is已更改,但更改未显示在 ListView 中,但如果我使用 foreach 输出 Collection,则名称为 Test。

视图.xaml

<Window x:Class="MovieDB3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="File">
                <MenuItem Header="Edit" Click="MenuEditClick"/>
            </MenuItem>
        </Menu>
        <Grid DockPanel.Dock="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <ListView VerticalAlignment="Stretch" Name="ListViewMovies" ItemsSource="{Binding Path=Collection}" IsSynchronizedWithCurrentItem="True" >
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <WrapPanel>
                            <TextBlock Text="{Binding Path=Name}"/>
                        </WrapPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </DockPanel>
</Window>

View.cs

using System;
using System.Windows;
using MovieDB3.Models;
using MovieDB3.ViewModels;

namespace MovieDB3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MainViewModel MVM;
        public MainWindow()
        {
            InitializeComponent();
            MVM = new MainViewModel();
            DataContext = MVM;
        }

        private void MenuEditClick(object sender, RoutedEventArgs e)
        {
            MVM.setMovieName((Movie)ListViewMovies.SelectedItem, "test");
        }
    }
}

视图模型

using System;
using System.ComponentModel;
using MovieDB3.Models;
using System.Collections.ObjectModel;

namespace MovieDB3.ViewModels
{
    class MainViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<Movie> Collection {get; set;}

        public MainViewModel()
        {
            Collection = new ObservableCollection<Movie>();

            //Test kode
            Movie movie = new Movie();
            movie.Name = "Klovn The Movie";
            Collection.Add(movie);
            movie = new Movie();
            movie.Name = "Taken";
            Collection.Add(movie);
        }

        public void setMovieName(Movie movie, string newName)
        {
            //movie.Name = newName;
            Console.WriteLine("CurrentName: " + movie.Name);
            int i = Collection.IndexOf(movie);
            Collection[i].Name = newName;
            Console.WriteLine("NewName: " + movie.Name);
            NotifyPropertyChanged("Name");
        }

        public void setMovieName(string currentName, string newName)
        {
            foreach (Movie movie in Collection)
            {
                if (movie.Name.Equals(currentName))
                {
                    movie.Name = newName;
                    NotifyPropertyChanged("Name");
                    return;
                }
            }
        }

        //public string MovieName
        //{
        //    set 
        //    {

        //        NotifyPropertyChanged("MovieName");
        //    }
        //}

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
}

Movie.cs

using System;

namespace MovieDB3.Models
{
    class Movie
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public double Rating { get; set; }
        public DateTime Release { get; set; }
        public TimeSpan Runtime { get; set; }
        public String Trailer { get; set; }
    }
}

INotifyPropertyChanged需要在您的 Movie 类中实现,也避免手动引发事件。 (现在你告诉 View ViewModel 的属性“Name”已更改,该属性不存在)


你的班级可能是什么样子:

public class Movie : INotifyPropertyChanged
{
    private string _name = String.Empty;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                NotifyPropertyChanged("Name");
            }
        }
    }

    //...All the other properties (the same way)...

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您的更改方法简化为:

    public void setMovieName(Movie movie, string newName)
    {
        Console.WriteLine("CurrentName: " + movie.Name);
        movie.Name = newName; //The notification is now raised automatically in the setter of the property in the movie class
        Console.WriteLine("NewName: " + movie.Name);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM 中的数据绑定 ObservableCollection 的相关文章

随机推荐

  • Jupyter Lab 显示小部件的问题(javascript 错误)

    我在新 PC 上复制 Jupyter Lab 安装时遇到问题 它在我的前一个上工作得很好 我无法显示简单的小部件 例如 ipywidgets 或 ipyvuetify 中的复选框 我检查了 jupyter widgets 是否已通过 jup
  • 跟踪源代码变体

    我很快就开始维护一系列包含相同嵌入式软件变体的产品 由于我已经使用 git 一年了并且非常欣赏它 所以我很可能使用它来进行源代码控制 我可以看到多种用于维护固件变体的选项 但没有一个让我太满意 您在自己的工作中应用了哪些最佳实践 我能想到的
  • 无法更改 iOS 7 (iPad) 上静态表视图单元格的背景颜色

    在 iPad 设备上运行时 我无法更改 iOS 7 上静态 UITableViewCells 的背景颜色 您可以通过以下设置轻松检查这一点 在 Xcode 5 中创建一个带有两个故事板的新通用项目 在每个故事板中 只放置一个控制器 表视图控
  • 代码 14:无法打开数据库

    我知道这个问题以前已经被问过 但是 问题是 相同的代码 用于数据库处理程序 适用于另一个应用程序 但不适用于我当前正在处理的应用程序 我什至通过检查设置中的权限来确保授予权限 这是日志猫 05 13 15 35 45 693 29696 2
  • 在 Java 8 中使用 Java 7 HashMap

    我已将 Java 应用程序更新到 Java 8 该应用程序严重依赖于 HashMap 当我运行基准测试时 我看到了不可预测的行为 对于某些输入 应用程序的运行速度比以前更快 但对于较大的输入 它的速度不断变慢 我检查了分析器 最耗时的操作是
  • 在矩阵上使用 ufunc.at

    假设我有以下 numpy 数组 gt gt gt a np zeros 10 gt gt gt a array 0 0 0 0 0 0 0 0 0 0 我可以用numpy ufunc at http docs scipy org doc n
  • Android 列表视图刷新

    我有一个 ListView 它通过数组向我显示一些数据 该数组位于另一个类中 我通过它的对象访问它 每当我通过上下文菜单从 ListView 中删除元素时 列表不会刷新 但该元素会从数组中删除 我怎样才能刷新列表来显示这一点 Code pu
  • jQuery 和 django-rest-framework-bulk:发送列表

    我需要使用 django rest Framework bulk mixins 将对象列表发送到视图 class APIPicksView mixins ListModelMixin bulk mixins BulkCreateModelM
  • 如何在散景中显示补丁的图例项

    在以下设置中 我根据基本示例创建面积图 如何自动甚至以编程方式获取输入的图例 现在我只得到带有一个项目 a 和第一种颜色的图例 from bokeh plotting import patches x2 for a in areas lis
  • 四舍五入两位小数

    double x 9 29 double y 8 69 double diff floor x y 100 0 5 100 0 这给了我 diff 为 0 6 但我需要它为 0 60 两位小数 有人可以帮我解决这个问题吗 double 的值
  • .htaccess 将所有子文件夹内容(带或不带结尾斜杠)重定向到同一子文件夹

    我想重定向以下网址 gallery image 1 gallery image 1 gallery image 2 gallery image 2 to gallery 但这比乍看起来要困难 这是来自 htaccess RewriteEng
  • Django,按日期范围内指定的月份和年份进行过滤

    我有以下型号 class Destination Deal models Model name models CharField Nombre max length 200 class Departure Date models Model
  • Javascript 事件似乎没有添加到动态生成的文本框中

    我为 JavaScript 中动态添加的文本框添加了 onkeyup javascript 但它似乎不起作用 var cell4 row insertCell 3 cell4 setAttribute align center var e3
  • JPEG 解压缩在 Windows 体系结构中不一致

    我正在使用不同版本的 Windows 的一堆计算机上测试 JPEG 解压缩 所有这些计算机都安装了 NET 4 我正在针对 NET 2 和 任何 CPU 平台目标进行编译 以下代码在不同的系统上产生不同的输出 Bitmap bmp Bitm
  • 优化“rootn(x, n)”的低精度近似

    rootn float t x int t n is a function that computes the n th root x1 n and is supported by some programming languages su
  • Windows 批处理:从文本文件设置变量

    我目前正在寻找一种通过 txt 文档中的链接在 Windows 批处理文件中设置变量的方法 例如 如果文本文件读取为 http website1 com http website2 com http website3 com 我希望可以将它
  • PHP-EWS“Soap 客户端返回状态 404”

    所以 我正在使用php ews http jamesarmes com php ews库连接到我的 Microsoft Office 365 Exchange 电子邮件帐户以阅读电子邮件 我已成功连接到它 并设法检索我需要的电子邮件列表 现
  • 可以拆分PHP配置文件php.ini吗?

    任何使用 php 的人都知道 php ini 是一个大文件 当您需要更改 ssh 时可能会让人头疼 例如我可以使用更改 nginx confinclude指令将启用站点的目录下的所有文件加载到主 nginx conf 中 所以我的问题很简单
  • 如何计算字符串的 CRC32

    如何计算 NET 中字符串的 CRC32 循环冗余校验和 这家伙似乎已经给你答案了 https damieng com blog 2006 08 08 calculate crc32 in c and net https damieng c
  • MVVM 中的数据绑定 ObservableCollection

    我有一个带有数据模板的 ListView 其中包含电影列表 它被数据绑定到 ObservableCollection 但每当我编辑 Movie Name 时 即使在我的 PropertyChangedEventHandler 中使用 Nam