WPF绑定一次,永不更新?

时间:2015-05-21 00:13:36

标签: c# wpf

我有一个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报告它。

1 个答案:

答案 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,因此不会通知此属性,因此如果名称确实更改,则不会通过此新属性传播。