Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当模型属性设置为新实例时更新MVVM视图_C#_Wpf_Mvvm - Fatal编程技术网

C# 当模型属性设置为新实例时更新MVVM视图

C# 当模型属性设置为新实例时更新MVVM视图,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个ViewModel和一个WPF应用程序中的视图。屏幕上有一系列输入(日期选择器、文本框和组合框) 输入绑定到ViewModel的NewItem属性,DataGrid绑定到WorkLog集合属性 当用户单击Add按钮时,我希望将NewItem添加到WorkLog集合,并重置NewItem属性以允许用户添加更多项。问题是,当我添加项时,如果我重新实例化NewItem,那么控件仍然会被填充,但在后台,VM值都是默认值(或null),因此它不起作用 如何重置NewItem属性并更新UI以反映这一

我有一个ViewModel和一个WPF应用程序中的视图。屏幕上有一系列输入(日期选择器、文本框和组合框)

输入绑定到ViewModel的NewItem属性,DataGrid绑定到WorkLog集合属性

当用户单击Add按钮时,我希望将NewItem添加到WorkLog集合,并重置NewItem属性以允许用户添加更多项。问题是,当我添加项时,如果我重新实例化NewItem,那么控件仍然会被填充,但在后台,VM值都是默认值(或null),因此它不起作用

如何重置NewItem属性并更新UI以反映这一点?我尝试了INotifyPropertyChanged,但没有成功(因为我正在设置为new instance,而不是更改值)

为了简洁起见,我修改了代码

模型

视图模型

public Model.WorkLogItem NewItem { get; set; }

public ObservableCollection<Model.WorkLogItem> WorkLog { get; set; }
在“添加”中单击

this.VM.WorkLog.Add(this.VM.NewItem);

this.VM.NewItem = new Model.WorkLogItem();

我这样做的方式是在我的数据对象中设置一个空构造函数,将其所有属性设置为默认值。然后,当我想将视图“重置”为所有空字段时,我只需将数据绑定属性设置为一个新项:

NewItem = new YourDataType();

这将按照预期更新所有数据绑定控件属性。请注意,我的数据类型类都实现了
INotifyPropertyChanged
接口,这种清除UI控件的方法只有在它们实现它的情况下才会起作用。

您的
视图模型
也必须实现
INotifyPropertyChanged

public class ViewModel : INotifyPropertyChanged
{
    private Model.WorkLogItem _newItem;

    public ViewModel()
    {
        NewItem = new Model.WorkLogItem();
        WorkLog  = new ObservableCollection<Model.WorkLogItem>();
    }

    public Model.WorkLogItem NewItem
    { 
        get { return _newItem; }
        set
        {
            _newItem = value;
            FirePropertyChanged("NewItem");
        }
    }

    public ObservableCollection<Model.WorkLogItem> WorkLog { get; set; }

    // INotifyPropertyChanged implementation here...
}

我在代码中的任何地方都看不到
NotifyPropertyChange
observedcollection
。你需要这些东西做双向装订。谢谢。我实现了INotifyPropertyChanged,并将所有列表更改为ObservableCollections,但没有任何区别。我尝试将其实例化为新实例,但没有在构造函数中显式设置值。我现在已经试过了,但不幸的是,它不起作用。我的值都已重置,因此我的对象是正确的,但UI没有更改-我认为这是因为它是一个新实例,而不是值更改,因此不会通知UI。当我将属性设置为新实例时,我的UI将被清除。。。UI不知道或不关心对象是否已更改。。。它只是绑定到新实例中变为空的属性值。我不知道我在做什么。我在XAML绑定中添加了notifyOnSourceUpdate=True,在每个属性上实现了inotifyPropertyChange,我的C#就是this.VM.WorkLog.Add(this.VM.WorkLogItem);this.VM.WorkLogItem=新模型.WorkLogItem();如果调用
this.VM.WorkLog.Add(new Model.WorkLogItem()),UI属性是否设置为新实例的值?否,相同的UI效果,但我的集合添加了一个空项。我已经用我的更新代码更新了问题谢谢。这就是我所缺少的,现在它正在发挥作用(几乎)。我会将此标记为答案,你知道为什么我的组合框不会重置所选项目吗?我使用了IsSynchronizedWithCurrentItem=“true”检查绑定是否具有双向模式(请参见答案的底部)。我具有此功能,并且还具有NotifyOnSourceUpdate=true您能描述一下“重置所选项目”的含义吗?数据将流向哪个方向?组合框是否未重置为空?组合框仍显示我选择的任何项目,尽管如果再次单击“添加”,则背景中的选定项目为空
this.VM.WorkLog.Add(this.VM.NewItem);

this.VM.NewItem = new Model.WorkLogItem();
NewItem = new YourDataType();
public class ViewModel : INotifyPropertyChanged
{
    private Model.WorkLogItem _newItem;

    public ViewModel()
    {
        NewItem = new Model.WorkLogItem();
        WorkLog  = new ObservableCollection<Model.WorkLogItem>();
    }

    public Model.WorkLogItem NewItem
    { 
        get { return _newItem; }
        set
        {
            _newItem = value;
            FirePropertyChanged("NewItem");
        }
    }

    public ObservableCollection<Model.WorkLogItem> WorkLog { get; set; }

    // INotifyPropertyChanged implementation here...
}
<ComboBox ... SelectedItem="{Binding ... Mode=TwoWay}" />