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。
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,所以不会有这个属性的通知,所以如果名字改变了,它不会通过这个新属性传播。