Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 如何禁止验证错误的自动数据绑定_C#_Wpf_Data Binding_Mvvm - Fatal编程技术网

C# 如何禁止验证错误的自动数据绑定

C# 如何禁止验证错误的自动数据绑定,c#,wpf,data-binding,mvvm,C#,Wpf,Data Binding,Mvvm,我正在用C#WPF创建一个简单的数据库应用程序,使用MVVM作为中继命令和数据绑定。对于数据库内容的内存存储,我使用ObservableCollection,它绑定到Datagrid,如下所示: 选择项目后,用户可以选择对其进行编辑。为了进行编辑,表单打开时会有一堆文本框,其中包含给定实体的数据。使用IDataErrorInfo验证所有字段,除非所有文本框都有效,否则不会启用“确定”按钮,因此无法将任何更改保存到集合和数据库 下面是示例文本框的外观: 但棘手的部分是,如果我更改文本框中的一些

我正在用C#WPF创建一个简单的数据库应用程序,使用MVVM作为中继命令和数据绑定。对于数据库内容的内存存储,我使用
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:)