我有一个ListView和一个GridView,它按名称列出应用程序中的用户。每当用户选择要编辑的用户时,我都会向TabControl添加一个新选项卡,并将所有可编辑属性绑定到WPF控件。
但是,当用户在“编辑”选项卡中进行编辑时,列表中的信息(特别是名称字段)也在更新中。
目前我正在制作要编辑的对象的副本并保留原始版本,因此它不会更新ListView,但是没有更好/更简单的方法来执行此操作吗?
我已尝试在GridView中设置Binding Mode=OneWay
,无法正常工作以及UpdateSourceTrigger=Explicit
但也无效。
有没有更简单的方法呢?
编辑:我实现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是:
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报告它。
答案 0 :(得分:0)
Mode=OneWay
导致信息流仅从绑定数据实体转到目标UI属性,对UI属性的任何更改都不会被绑定回来。
UI内容发生变化的原因是因为底层属性是读/写(即具有getter和setter)并且正在通知任何值更改(由于INPC interface的实现)。 / p>
假设它是您绑定到GridView的User
个对象的列表,您有两个简单的选项来解决这个问题。哪一个最好取决于你有多少改变的范围:
更改Name
对象上的当前User
属性,删除它的setter。用一个方法替换setter来设置属性(即SetUserName(string name)
),然后设置私有成员变量。或者将名称作为参数传递给User
实体的构造函数。
创建一个只有一个getter的新属性,该getter返回名称并设置你的绑定;即public string UserName { get { return Name; }}
。由于只有一个getter,因此不会通知此属性,因此如果名称确实更改,则不会通过此新属性传播。