WPF:OnCollectionChanged 未触发

2024-03-03

使用 VS 2102、.NET 4.0 和 MVVM Light。

我有以下代码,可将 XML 文件中的项目读取到 ObservableCollection 中。然后,如果集合发生更改(使用 IsDirty 标志)但 OnCodeCollectionChanged 方法未执行,我想使用转换器更新“保存”按钮。

该集合正确显示在数据网格中,我可以向数据网格添加新条目,但永远不会调用 OnCodeCollectionChanged 方法。我不想捕获现有项目的更改(我知道 ObservableCollection 不会通知该更改),我只是想在集合中添加或删除新项目时引发更改事件。

我做错了什么,有更好的方法来做我想做的事吗?

Codes.cs(模型)

[Serializable()]
public class Codes
{
    public Codes() { }

    [XmlElement("Code")]
    public ObservableCollection<Code> CodeCollection { get; set; }

}

[Serializable()]
public class Code
{
    [XmlElement("AccpacCode")]
    public string AccpacCode { get; set; }

    [XmlElement("LAC")]
    public string LAC { get; set; }

    [XmlElement("SCSCode")]
    public string SCSCode { get; set; }

    [XmlElement("ParentEmployerAccpacCode")]
    public string ParentEmployerAccpacCode { get; set; }
}

MainViewModel.cs(视图模型)

public class MainViewModel : ViewModelBase
{
    public bool IsDirty = false;

    /// <summary>
    /// ObservableCollection of Codes
    /// </summary>
    private const string CodeCollectionPropertyName = "CodeCollection";
    private ObservableCollection<Code> _codeCollection;
    public ObservableCollection<Code> CodeCollection
    {
        get
        {
            if (_codeCollection == null)
            {
                _codeCollection = new ObservableCollection<Code>();
            }
            return _codeCollection;
        }
        set
        {
            if (_codeCollection == value)
            {
                return;
            }

            _codeCollection = value;
            RaisePropertyChanged(CodeCollectionPropertyName);
        }
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel(IDataService dataService)
    {
        // Change notification setup
        CodeCollection.CollectionChanged += OnCodeCollectionChanged;

        // Load XML file into ObservableCollection
        LoadXML();
    }

    private void LoadXML()
    {
        try
        {
            XmlSerializer _serializer = new XmlSerializer(typeof(Codes));

            // A file stream is used to read the XML file into the ObservableCollection
            using (StreamReader _reader = new StreamReader(@"LocalCodes.xml"))
            {
                CodeCollection = (_serializer.Deserialize(_reader) as Codes).CodeCollection;

            }                
        }
        catch (Exception ex)
        {
            // Catch exceptions here
        }

    }

    private void SaveToXML()
    {
        try
        {

        }
        catch (Exception ex)
        {

        }
    }

    private RelayCommand<ViewModelBase> _saveButtonClickedCommand;
    public RelayCommand<ViewModelBase> SaveButtonClickedCommand;
    private void SaveButtonClicked(ViewModelBase viewModel)
    {
        SaveToXML();
    }

    private void OnCodeCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        IsDirty = true;
    }
}

MainWindow.xaml(视图)

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Skins/MainSkin.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <conv:IsDirtyConverter x:Key="IsDirtyConverter" />

    </ResourceDictionary>
</Window.Resources>

<Grid x:Name="LayoutRoot">

    <TextBlock FontSize="36"
               FontWeight="Bold"
               Foreground="Purple"
               Text="{Binding WelcomeTitle}"
               VerticalAlignment="Top"
               TextWrapping="Wrap" Margin="10,10,10,0" Height="54" HorizontalAlignment="Center" />

    <DataGrid Margin="10,69,10,38"
              ItemsSource="{Binding CodeCollection}"/>
    <Button Name="SaveButton" Content="Save" HorizontalAlignment="Right" Margin="0,0,90,10" Width="75"
            Command="{Binding SaveButton_Click}"
            Background="{Binding IsDirty, Converter={StaticResource IsDirtyConverter}}" Height="20" VerticalAlignment="Bottom"/>
    <Button Content="Refresh" HorizontalAlignment="Right" Margin="0,0,10,10" Width="75"
            Command="{Binding RefreshButton_Click}" Height="20" VerticalAlignment="Bottom"/>

</Grid>

移动你的CodeCollection.CollectionChanged += OnCodeCollectionChanged;从构造函数到的代码LoadXml填充集合后的代码

    private void LoadXML()
    {
        try
        {
            XmlSerializer _serializer = new XmlSerializer(typeof(Codes));

            // A file stream is used to read the XML file into the ObservableCollection
            using (StreamReader _reader = new StreamReader(@"LocalCodes.xml"))
            {
                CodeCollection.CollectionChanged -= OnCodeCollectionChanged;
                CodeCollection = (_serializer.Deserialize(_reader) as Codes).CodeCollection;
                CodeCollection.CollectionChanged += OnCodeCollectionChanged;

            }                
        }

您正在更改 CodeCollection 的实例,需要再次注册该事件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:OnCollectionChanged 未触发 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • malloc() 和 free() 在哪里存储分配的大小和地址?

    在哪里malloc and free 存储分配的地址及其大小 Linux GCC 我读过一些实现将它们存储在实际分配的内存之前的某个位置 但我无法在测试中确认这一点 背景 也许有人对此有另一个提示 我正在尝试分析一个进程的堆内存 以确定另一
  • 如何删除精明图像中的直线或非曲线

    I have a canny edge image 我想删除除了看起来像半圆 椭圆或 C 的线之外的所有线 尝试过霍夫圆变换 它检测所有曲线 不需要 一个简单的方法是 查找连接的组件 找到最小定向边界框 计算盒子的长宽比 并检查是否太大拉长
  • capistrano 顺序重启

    我将 capistrano 配置为跨三台物理服务器进行部署 我想将重新启动任务配置为按顺序转到每个服务器并重新启动应用程序 而不是立即转到所有服务器的默认方式 这是当前的部署任务 namespace deploy do task start
  • ASP.NET MVC 路由失败。这是错误还是极端情况?

    我有一个 ASP NET MVC 3 应用程序 用户可以在其中发布类似于 bla bla如果会更好雅达雅达雅达 对于建议详细信息页面 我定义了一个很好的搜索引擎优化友好路线如下 routes MapRoute null suggestion
  • Espresso webView webkeys 在 Android 8.0 模拟器上失败

    我正在从 Espresso Web 运行一些测试代码 Test public void typeTextInInput clickButton SubmitsForm Lazily launch the Activity with a cu
  • 如何使用 tvOS 打开另一个应用程序?

    Does UIApplication openURL work NSString iTunesLink http www youtube com watch v TFFkK2SmPg4 BOOL did UIApplication shar
  • 如何创建一个使用 gzip 压缩静态文件的简单节点服务器

    我已经在这几个小时了 我做的第一件事就是跟随this http blog modulus io nodejs and express static content教程有这个代码 var express require express var
  • 在 DateTimePicker 中设置小时超过 23

    在我的项目中 我需要使用格式为 HH MM 的 Timepicker 但我将它用作持续时间 而不是时间 所以是否可以将 HH 增加到 99 而不是停留在 23 我使用此页面中的日期时间选择器 http tarruda github io b
  • 以干净的方式打破 javascript 承诺链

    我正在尝试将承诺串联起来 这样如果一个承诺被拒绝 链条就会断裂 我跟随一个人的线索上一个SO问题 https stackoverflow com questions 20714460 break promise chain and call
  • (413) 请求实体太大 |上传预读大小

    我使用 NET 4 0 编写了一个 WCF 服务 该服务托管在我的 Windows 7 上x64带有 IIS 7 5 的终极系统 其中一个服务方法有一个 对象 作为参数 我正在尝试发送一个包含图片的字节 只要该图片的文件大小小于约 48KB
  • 使用 webpack 配置 CSS 模块时出错

    我正在尝试使用 webpack 配置 CSS 模块 但出现错误 我已经检查了 stackoverflow 上的其他答案 但到目前为止 没有一个解决方案对我有用 我已经按照文档的建议添加了加载程序 但它仍然显示错误 这是我的 webpack
  • 在 jQuery mobile 中创建侧边栏

    通常 当您使用 jQuery mobile 创建 data role page 元素时 它会占据整个查看区域 因此 我不明白如何创建侧边栏 我想模拟以下内容 但查看源代码没有多大帮助 http jquerymobile com demos
  • 嵌套字典到 MultiIndex pandas DataFrame(3 级)

    我想对 3 级嵌套字典执行相当于此操作 嵌套字典到多索引数据框 其中字典键是列标签 https stackoverflow com questions 24988131 nested dictionary to multiindex dat
  • 来自 CALayer 的 CGImage(或 UIImage)

    我创建了一个CALayer 我向图层添加了几个形状 但最终我只有一个 CALayer 并且将其添加到 CGImage 时遇到了很多麻烦 我找到了一些参考资料 CALayer renderInContext ctx 但我不知道如何实现它 以前
  • 我可以拥有在单个 js 文件中发出 Angular 元素的 Angular 库吗?

    我开始接触 Angular 6 位 并且对 Angular Elements 以及新的库项目非常感兴趣 我即将开展一个项目 可能需要这两个新功能 我需要创建可跨 Web 框架重用的自定义 UI 组件 但我也希望获得在 Angular 项目中
  • 忽略版本控制上的文件夹元文件

    Unity 创建和删除元文件folders在资源文件夹内 在使用版本控制时 这可能会产生令人烦恼的情况 您可以跳过并转到问题 有人创建了一个将被忽略的文件文件夹 但忘记忽略该文件夹的元文件 Unity 创建元文件 此人将元添加到版本控制中
  • Android 获取设备区域设置

    安装 Android 程序后 我检查设备区域设置 String deviceLocale Locale getDefault getLanguage 如果 deviceLocale 在我支持的语言 英语 法语 德语 内 我不会更改区域设置
  • 如何在 where 子句中使用别名?

    我试图在多列文本和备忘录中搜索我不想看到的某些短语和黑名单短语 假设如下表 stories id title author publisher content 前任 我想找到所有提到 在任何领域 苹果 但将 苹果酱 列入黑名单的故事 SEL
  • Apple Silicon 上的 ARCHFLAGS 值正确吗?

    在我以前的基于 Intel 的 Mac 上 我曾经包含 export ARCHFLAGS arch x86 64 在我的 shell 资源文件中 新的基于 ARM 的 Apple 芯片上的正确编译标志是什么 arm arm64 arm 64
  • WPF:OnCollectionChanged 未触发

    使用 VS 2102 NET 4 0 和 MVVM Light 我有以下代码 可将 XML 文件中的项目读取到 ObservableCollection 中 然后 如果集合发生更改 使用 IsDirty 标志 但 OnCodeCollect