WPF绑定一次,永不更新

本文关键字:更新 一次 绑定 WPF | 更新日期: 2023-09-27 17:50:15

我有一个ListView和一个GridView,它们按名称列出应用程序中的用户。每当用户选择要编辑的用户时,我都会向TabControl添加一个新选项卡,并将所有可编辑属性绑定到WPF控件。

但是,当用户在Edit选项卡中编辑时,List中的信息(特别是name字段)也被更新。

目前我正在制作要编辑的对象的副本,并离开原来的,所以它不更新ListView,但有没有更好/更容易的方法来做到这一点?

我试过设置Binding Mode=OneWay,没有工作,也UpdateSourceTrigger=Explicit在GridView中,但也没有工作。

有更简单的方法吗?

编辑:我实现INotifyPropertyChanged类的方式是问题的一部分,因为我有这个:

public partial class MyTabControl : UserControl
{
    public MyTabControl()
    {
        InitializeComponent();
        //Here, DataContext is a List<Users>
        //Users being my Model from the Database
        //Some of it's properties are bound to a GridView
        //User doesn't implement INPC
    }
    public void OpenTab(object sender, RoutedEventArgs e)
    {
        User original = (sender as Button).DataContext as User;
        // - This will create a new ViewModel below with the User I'm sending
        MyTabControl.AddTab(original);
    }
}

我的ViewModel of Users是:

public class UserViewModel : INotifyPropertyChanged
{
    public User Original { get; private set; }
    public string Name { get { return Original.Name; } set { Original.Name = value; OnPropertyChanged("Name"); } }
    public UserViewModel(User original)
    {
        Original = original ?? new User();
    }
    // - INPC implementation
}

由于我的ViewModel是报告属性变化的,我没想到我原来的User也报告给GridView。

WPF绑定一次,永不更新

Mode=OneWay使信息流仅从绑定的数据实体转到目标UI属性,对UI属性的任何更改都不会被绑定回来。

UI内容改变的原因是因为底层属性是读/写的(即有一个getter和一个setter),并且通知任何值的改变(由于INPC接口的实现)。

假设它是一个User对象的列表,你绑定到GridView,你有两个简单的选项来解决这个问题。哪一个是最好的取决于你有多大的变化范围:

  • 改变当前User对象上的Name属性,移除它的setter。将setter替换为设置属性的方法(即SetUserName(string name)),然后设置私有成员变量。或者将名称作为参数传递给User实体的构造函数。

  • 创建一个新的属性,只有一个getter返回名称,并将绑定设置为它;即public string UserName { get { return Name; }}。因为只有一个getter,所以不会有这个属性的通知,所以如果名字改变了,它不会通过这个新属性传播。