WPF:绑定数据网格不更新项目属性

2023-11-24

我正在尝试实现我的第一个 MVVM 应用程序。我可以将数据绑定在数据网格中,但是我在项目中所做的更改不会触发模型的 RaisePropertyChanged 方法。

这是我的视图模型

    public class UsersViewModel : BaseViewModel
{
    private static TOPEntities _context;
    private ObservableCollection<UserModel> _usersCollection;

           public UsersViewModel()
    {
        _usersCollection = new ObservableCollection<UserModel>(GetAllUsers());

    }
          public ObservableCollection<UserModel> UsersCollection
    {
        get { return _usersCollection; }
        set
        {
            if (_usersCollection != value)
            {
                _usersCollection = value;
                RaisePropertyChanged(() => UsersCollection);
            }
        }
    }
public static List<UserModel> GetAllUsers()
    {
        using (_context = new TOPEntities())
        {

            return _context.Users.Select
             (user => new UserModel
             {
                 Id_User = user.Id_User,
                 Name = user.Name,
                 Username = user.Username,
                 Language = user.Language,
                 Password = user.Password,
                 Profile = user.Profile

             }).ToList();

        }
    }

模型,实现提供 INotifyPropertyChanged 的​​ NotificationObject 类

    public class UserModel : NotificationObject
{
    #region Construction
    /// Constructs the default instance of a UserModel
    public UserModel()
    {

    }
    #endregion

    #region Model Attributes

    private int _id_User;
    private string _username;
    private string _password;
    private string _profile;
    private string _name;
    private string _language;

    #endregion

    #region Properties



    public int Id_User
    {
        get { return _id_User; }
        set
        {
            if (_id_User != value)
            {
               _id_User = value;
               RaisePropertyChanged(() => Id_User);
            }
        }
    }


    public string Username
    {
        get { return _username; }
        set
        {
            if (_username != value)
            {
                _username = value;
                RaisePropertyChanged(() => Id_User);
            }
        }
    }

    public string Password
    {
        get { return _password; }
        set
        {
            if (_password != value)
            {
                _password = value;
                RaisePropertyChanged(() => Id_User);
            }
        }
    }

    public string Profile
    {
        get { return _profile; }
        set
        {
            if (_profile != value)
            {
                _profile = value;
                RaisePropertyChanged(() => Id_User);
            }
        }
    }

    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                RaisePropertyChanged(() => Name);
            }
        }
    }

    public string Language
    {
        get { return _language; }
        set
        {
            if (_language != value)
            {
                _language = value;
                RaisePropertyChanged(() => Language);
            }
        }
    }

    #endregion


}

}

最后是视图:

<Window x:Class="TOP2.Views.UsersView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:viewModels="clr-namespace:TOP2.ViewModels"
    xmlns:local="TOP2"
    Title="Sample App"
    WindowStartupLocation="CenterScreen"
    Height="459"
    Width="795">
<Window.Resources>
    <viewModels:UsersViewModel x:Key="Windows1ViewModel" />
</Window.Resources>
<Grid DataContext="{StaticResource Windows1ViewModel}">
    <DataGrid ItemsSource="{Binding UsersCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="81,51,0,0" VerticalAlignment="Top" Height="332" Width="622">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataGrid.Columns>

    </DataGrid>

</Grid>

我忘记了什么或做错了什么?

提前致谢!

Oscar


非常感谢 Loetn 和 Andras Sebö,你们的线索非常有帮助!下面的解决方案是我采用的并且效果非常好!

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; // ObservableCollection
using System.ComponentModel; // INotifyPropertyChanged
using System.Collections.Specialized; // NotifyCollectionChangedEventHandler
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObservableCollectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // ATTN: Please note it's a "TrulyObservableCollection" that's instantiated. Otherwise, "Trades[0].Qty = 999" will NOT trigger event handler "Trades_CollectionChanged" in main.
            // REF: http://stackoverflow.com/questions/8490533/notify-observablecollection-when-item-changes
            TrulyObservableCollection<Trade> Trades = new TrulyObservableCollection<Trade>();
            Trades.Add(new Trade { Symbol = "APPL", Qty = 123 });
            Trades.Add(new Trade { Symbol = "IBM", Qty = 456});
            Trades.Add(new Trade { Symbol = "CSCO", Qty = 789 });

        Trades.CollectionChanged += Trades_CollectionChanged;
        Trades.ItemPropertyChanged += PropertyChangedHandler;
        Trades.RemoveAt(2);

        Trades[0].Qty = 999;

        Console.WriteLine("Hit any key to exit");
        Console.ReadLine();

        return;
    }

    static void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString() + ", Property changed: " + e.PropertyName + ", Symbol: " + ((Trade) sender).Symbol + ", Qty: " + ((Trade) sender).Qty);
        return;
    }

    static void Trades_CollectionChanged(object sender, EventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString() + ", Collection changed");
        return;
    }
}

#region TrulyObservableCollection
public class TrulyObservableCollection<T> : ObservableCollection<T>
    where T : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler ItemPropertyChanged;

    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += new NotifyCollectionChangedEventHandler(TrulyObservableCollection_CollectionChanged);
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);

        if (ItemPropertyChanged != null)
        {
            ItemPropertyChanged(sender, e);
        }
    }
}
#endregion

#region Sample entity
class Trade : INotifyPropertyChanged
{
    protected string _Symbol;
    protected int _Qty = 0;
    protected DateTime _OrderPlaced = DateTime.Now;

    public DateTime OrderPlaced
    {
        get { return _OrderPlaced; }
    }

    public string Symbol
    {
        get
        {
            return _Symbol;
        }
        set
        {
            _Symbol = value;
            NotifyPropertyChanged("Symbol");
        }
    }

    public int Qty
    {
        get
        {
            return _Qty;
        }
        set
        {
            _Qty = value;
            NotifyPropertyChanged("Qty");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
#endregion
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:绑定数据网格不更新项目属性 的相关文章

  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 将 MouseBindings 添加到数据绑定 WPF ListView 中的项目

    我试图在用户单击 ListView 中的项目时执行 ViewModel 中的命令 当我添加一个ListViewItem在 XAML 中我可以添加一个MouseBinding to its InputBindings
  • WPF 简单绑定到对象属性

    我在 wpf xaml 中绑定时遇到一些问题 有这个简单的文件
  • 当 DataTable 为空时,DataGrid 显示空行

    我有一个DataGrid dg1 绑定到DataTable 数据集 表 代码运行良好并且DataGrid正在显示数据DataTable正确 但是 如果我Clear the DataTable the DataGrid也很清楚 但留下一个空行
  • 如何在 WPF 中设置窗口边框和标题栏的样式? [复制]

    这个问题在这里已经有答案了 我们正在开发一个 WPF 应用程序 它使用 Telerik 的控件套件 一切正常且看起来很好 不幸的是 我们最近需要替换所有对话框的基类 将 RadWindow 更改为标准 WPF 窗口 原因与本讨论无关 通过这
  • MVVM 创建 ViewModel

    有人可以向我解释一下如何为 MVVM 模式创建 ViewModel 我试图理解这里的教程 http msdn microsoft com en us magazine dd419663 aspx http msdn microsoft co
  • WPF:在关闭事件触发之前,不会提交对具有焦点的文本框的更改

    我有一个用于编辑数据库信息的 WPF 窗口 它使用实体框架对象表示 当用户关闭窗口时 我想在 Closing 事件中注意到信息是否已更改 并显示一个消息框 提供将更改保存到数据库的信息 不幸的是 在编辑失去焦点之前 对当前焦点编辑的更改不会
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 数据绑定到代码隐藏中的目标 CLR 属性

    在代码隐藏中绑定到依赖属性很容易 你只需创建一个新的System Windows Data Binding对象 然后调用目标依赖对象的SetBinding method 但是 当我们绑定的属性是 CLR 属性并且您无法提供Dependenc
  • 从字节数组创建 BitmapImage

    我正在创建一个包含任意值的字节数组 并希望将其转换为 BitmapImage bi new BitmapImage using MemoryStream stream new MemoryStream data try bi BeginIn
  • C# - WPF - 组合框 - 将鼠标悬停在聚焦的组合框上时防止滚动(使用附加属性)

    背景 我需要防止ComboBox从将鼠标悬停在其上 聚焦时 时滚动和使用鼠标滚轮滚动 在这种情况下 我无法使用隐藏代码 因此我使用附加属性 我刚问这个问题 https stackoverflow com questions 76101509
  • 在 ViewModel 中使用 CollectionViewSource 的正确方法

    我使用拖放将数据源对象 数据库模型 绑定到DataGrid 基本上遵循这个例子实体框架与 WPF 的数据绑定 http msdn microsoft com en us data jj574514 通过这个实现 一切都运行良好 XAML
  • ResourceDictionary WPF 中样式的交互触发器

    我有一个ComboBox我需要在应用程序的多个地方使用它 所以我设置了它的大部分属性ComboBox in ResourceDictionary并在我需要的地方将其用作样式 风格为ComboBox is
  • 内容更新时自动调整列表视图列的大小

    我试图让列表视图中的 gridviewcolumns 在更新绑定源 视图模型上的可观察集合 时自动调整内容大小 列表视图填充正常 但当我刷新 更新集合时不起作用 这是我到目前为止正在尝试的解决方案 XAML
  • 密码盒和 MVVM

    我们有以下场景 MVVM 用户界面 用户可以在其中输入密码 实际上是一个PasswordBox 应该做一些工作的服务器 服务器连接到一些需要身份验证的数据库 我已经读过这个关于MVVM中PasswordBox的问题 https stacko
  • 如何使用故事板更改wpf中网格行的高度

    我有一个Grid有 2 行
  • 使用backgroundworker手动停止调试

    我正在编写一个 WPF C 项目 使用BackgroundWorker 带有进度条的弹出窗口 我开始调试 F5 键 来检查我的程序 之后BackgroundWorker完成并关闭弹出窗口 关闭MainWindow不会自动停止调试过程 我必须
  • WPF PRISM 事件订阅不会消亡

    我有一个 PRISM RegionManager 其中有几个区域 顶部的功能区区域和其下方用于我的视图的主要内容区域 相当基本 该应用程序以主要内容区域中的 主页 视图开始 当我单击功能区上的按钮时 我将第二个视图注入内容区域并在区域管理器
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一

随机推荐

  • 支持多种屏幕尺寸 - Android

    我将在 Android 中开发新的应用程序 此应用程序只能在纵向模式下运行 即使对于平板电脑也是如此 此外 手机和平板电脑上的用户界面和布局设计应该相似 我们无法改变平板电脑的布局设计 因为它有很大的使用面积 我们必须拉伸所有图像以匹配手机
  • 权限处理的模式/设计建议

    我们的 ASP NET Web 应用程序中有一个相当复杂的权限处理系统 用户可以对不同类型的对象拥有特定的权限 某些权限甚至打包到分配给用户的组 角色中 总而言之 这最终会导致相当复杂的混乱 为了确定用户是否可以执行 查看某些内容 您必须评
  • 真随机数生成器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 抱歉 这不是一个 真正的 问题 但我记得以前在这里看到过一篇关于随机随机化随机发生器以生成真正随机数的帖子 而不仅仅是伪随机数 如果我搜索它 我看不
  • 以编程方式确定 Excel 文件 (.xls) 是否包含宏

    有没有办法以编程方式确定 xls 是否包含宏 而无需在 Excel 中实际打开它 还有什么方法可以检查这些宏是用哪个证书 包括时间戳证书 签名的 再次不使用 Excel 我特别想知道当存在宏时 是否有任何字符串始终显示在 Excel 文件的
  • 在 Android 中取消已经打开的 toast

    我目前正在开始开发 Android 应用程序 并且一直在跟进本教程关于如何使用和改进 Google 地图应用程序 我已经成功地在屏幕上显示地图 触摸后我得到了一个位置的地址 通过反向地理编码 并显示了Toast 但这是我的问题 当您在地图上
  • 使用 DX10 的 D3D 图像

    是否可以将 DirectX 10 我正在使用 SlimDX 与 WPF 的 D3DImage 一起使用 我能找到的唯一示例和文档仅显示使用 DX9 表面 是的 您可以在 WPF 中通过 D3DImage 使用 DirectX 10 11 和
  • 使用 AJAX 获取 html 内容后向新元素添加侦听器的正确方法是什么? (jQuery、Javascript)

    我正在制作一些可以通过 AJAX 加载新设置页面的东西 我不确定将侦听器绑定到新内容页面中的这些元素的最有效方法是什么 这是我的想法 我可以创建一个比较文件路径的函数 对于每个条件 我将根据 AJAX 加载的页面将正确的侦听器应用于这些新元
  • 在 VS Code 终端(即 Windows Powershell)中编译时遇到问题

    当我右键单击 运行代码 并在用户设置中的终端中运行时 我收到这些错误 At line 1 char 63 c Users Josh Documents Programming Learning to Program g Exe The to
  • 如何在存储过程中调用C#函数

    SQL Server 2005 支持 CLR 因此这意味着我们可以在后端使用 CLR 那么如何做到这一点 我在 C 中有一些函数可以对日期时间变量进行一些复杂的操作 现在我想在 SP 中使用这些函数 首先 这是否可以做到 是的 可以在 SQ
  • 如何在 VBA 窗体上显示 Excel 的一部分

    我有一个 csv 格式的文件 从 A S 列 它有一些记录 例如表格 我的完整程序将插入 删除 删除 添加一些行 列和编辑单元格值等 我设法编写了我需要的所有操作的代码 现在我正在尝试将其与图形用户界面集成 我想要的是显示从 Ax1 到 V
  • 对 'GET_LIST' 的响应必须类似于 { data : [...] },但接收到的数据不是数组

    我正在尝试使用ra data simple rest 数据提供商 import React from react import Admin fetchUtils Resource from react admin import simple
  • Jenkins - 我如何将参数从上游传递到下游

    我有 3 个版本 A 是控制流程的主版本 B 另一个构建 C 将在B之后执行 我想向 A 添加一个字符串参数 以便用户手动输入一些字符串 但我不确定如何将此参数传递给 B 可以说这是我的构建流程 构建 B 构建 C 我不知道如何将参数传递给
  • 计算拦截向量

    我有 2 个对象 我将它们称为target and 拦截器 我知道目标的当前位置和速度 我知道拦截器的当前位置和飞行速度 由此 我现在需要知道的是 是否可能进行拦截 即同一时间点的同一位置 拦截弹需要沿着什么矢量飞行 拦截需要多长时间 即每
  • 在 SharedPreferences 中存储字符串数组

    我想知道是否可以在共享首选项中保存一个字符串数组 每次我们保存某个字符串时 我们都会将其存储在该数组中 例如 我有一个具有特定 ID 的位置列表 我想将其标记为收藏夹 理想的情况是 拥有一个数组并在该数组中保存某个位置 ID 我们称之为 L
  • Elixir:不同数量的函数重载

    有没有办法定义具有不同数量的重载函数 例如在 C 中我可以这样做 foo bar or foo bar baz 在 Elixir 中 唯一的方法是将它们放在单独的模块中 这很快就会变得混乱 有什么办法解决吗 编辑 我做了一个错误的假设 我看
  • std::atomic::notify_all 是如何排序的?

    我希望下面的程序不会挂起 如果在 1 中以相反的顺序观察 2 和 3 则可能会因丢失通知而挂起 include
  • 如何在 select2 jquery 中的标记中设置默认值

    我正在使用 select2 http ivaynberg github io select2 作为我的标记输入 从使用 select2 标记的示例中 代码如下所示 e12 select2 tags red green blue 现在我的问题
  • Python字符串模式识别/压缩

    我可以做基本的正则表达式 但这略有不同 即我不知道模式会是什么 例如 我有一个类似字符串的列表 lst asometxt0moretxt bsometxt1moretxt aasometxt10moretxt zzsometxt999mor
  • “无法打开插座”

    如何缓解我的网站上发生的 无法打开套接字 错误 我遇到了麻烦 它是CAPTCHA 我在用着验证码 它仅在我使用 reCAPTCHA 的两个页面上显示此错误 我一直在生成新的密钥集 有时有效 有时无效 例如 它工作于Safari有时不是 但在
  • WPF:绑定数据网格不更新项目属性

    我正在尝试实现我的第一个 MVVM 应用程序 我可以将数据绑定在数据网格中 但是我在项目中所做的更改不会触发模型的 RaisePropertyChanged 方法 这是我的视图模型 public class UsersViewModel B