C# 如何禁止验证错误的自动数据绑定
我正在用C#WPF创建一个简单的数据库应用程序,使用MVVM作为中继命令和数据绑定。对于数据库内容的内存存储,我使用C# 如何禁止验证错误的自动数据绑定,c#,wpf,data-binding,mvvm,C#,Wpf,Data Binding,Mvvm,我正在用C#WPF创建一个简单的数据库应用程序,使用MVVM作为中继命令和数据绑定。对于数据库内容的内存存储,我使用ObservableCollection,它绑定到Datagrid,如下所示: 选择项目后,用户可以选择对其进行编辑。为了进行编辑,表单打开时会有一堆文本框,其中包含给定实体的数据。使用IDataErrorInfo验证所有字段,除非所有文本框都有效,否则不会启用“确定”按钮,因此无法将任何更改保存到集合和数据库 下面是示例文本框的外观: 但棘手的部分是,如果我更改文本框中的一些
ObservableCollection
,它绑定到Datagrid,如下所示:
选择项目后,用户可以选择对其进行编辑。为了进行编辑,表单打开时会有一堆文本框,其中包含给定实体的数据。使用IDataErrorInfo
验证所有字段,除非所有文本框都有效,否则不会启用“确定”按钮,因此无法将任何更改保存到集合和数据库
下面是示例文本框的外观:
但棘手的部分是,如果我更改文本框中的一些值,然后关闭窗口,新值将传播到ObservableCollection
,我不想这样做。你知道如何防止这种行为吗?我想数据绑定工作后,才点击按钮。否则,数据绑定会很好地工作,因此按钮(dis/en)会在单击后显示并反映对数据库和集合的更改。两个视图都由不同的ViewModel提供服务,视图之间的数据通过触发事件传递
我试图将DataGrid
UpdateSourceTrigger=Explicit
添加到ItemsSource绑定中,但没有帮助。也许,我缺少一些应用程序逻辑
非常感谢您的帮助。最好将代码放入域对象的属性设置器中。然后通过触发
NotifyPropertyChanged
处理程序与视觉效果同步
有关此主题的更多信息:将绑定模式设置为Explicit应该需要调用绑定表达式UpdateSource()方法将更改发送回模型。因为您只提到在DataGrid的绑定上设置了显式,所以我猜您只需要确保在直接绑定回模型的任何属性上显式设置了该模式。例如,在上述情况下,文本框的文本绑定。这可能会解决您的问题,但需要以某种方式对每个目标的BindingExpression调用UpdateSource() 如果您使用的是主流ORM之一(EF、Linq到SQL等),那么您的实体很可能会自动实现INotifyPropertyChanged和INotifyPropertyChanged。因为您正在共享对单个实例的引用,所以编辑中的所有更改都将反映在主视图以及绑定到该实例的任何其他内容中。作为一种更脏的选择,您可以只创建一个相同类型的单独实例,并在窗口的对话框结果为true时手动将值复制回来 第一种方法要求您手动更新绑定,第二种方法要求您手动更新编辑实例中的值
通过编写更多的代码,我可以帮助您实现特定的方法。这就是大多数WPF开发人员在假设方面犯错误的地方 在MVVM中,脏数据可以存储在
ViewModel
中,这就是VM层的用途!它从模型
的角度模拟了视图
,因为视图
出错,所以视图模型
也会出错。这是完全正确的
话虽如此,问题依然存在
您将如何不允许临时/脏数据流到您的
可观察到的收集
两种方式
observedcollection
特定于您的模型类(比如MyItem
),那么如果您的模型类(MyItem
)是实体类\DAL类\NHibernate类创建名为ViewModelMyItem
的MyItem
类的包装,然后使用ObservableCollection
代替ObservableCollection
这样,来自视图
的脏数据将位于视图模型MyItem
中,并且只有在单击保存
按钮时,它才能合法地飞回模型类(MyItem
)。因此,这意味着在Save命令
的Execute()
委托中,如果ViewModelMyItem
中的验证正常,您可以将ViewModelMyItem
的属性复制\克隆到项
的属性中
因此,如果Item
是一个EntityType
class/NHibernate
class/WCF
client model类,它将始终仅在ViewModelMyItem
预先过滤临时/脏信息时才有效BindingExpressions.UpdateSource()
,否则它会停止双向数据流回到sorce项
但据我所知,这直接击败了MVVM,因为ViewModel
不会有UI显示的内容!不过,您仍然可以通过留在MVVM空间中,使用*附加行为*来管理显式绑定
让我知道这是否有帮助 这就是我实际做的,带有datagrid的ViewModel包含软件实体的集合。viewmodel for edition包含一个软件实体,其属性填充如下:`public string Name{get{return Software.Name;}set{if(Software.Name!=value){Software.Name=value;OnPropertyChanged(“Name”);}}}`否则我不明白你的意思(这正是我要找的。Thanx:)