Wpf 传递回源的null或空数据的双向模式绑定场景

Wpf 传递回源的null或空数据的双向模式绑定场景,wpf,mvvm,binding,Wpf,Mvvm,Binding,我有两个WPF窗口: -其中一个显示数据列表 -另一个显示单击列表中的按钮时特定数据的详细视图 实际问题是: 当我从文本框或基本上是字符串值中删除或删除汽车类型数据时,“空”值会反映回数据列表。 文本框使用双向模式。 但是,如果删除或清空包含枚举数据或int数据的文本框,空值不会反映回列表,只有当数据为字符串时才会出现问题 下面是从ListView中选择的数据快照: MVVM体系结构和WPF新手请对我放松:|您不能将int属性或Country属性设置为空字符串 如果将属性定义为可空,则可以

我有两个WPF窗口: -其中一个显示数据列表 -另一个显示单击列表中的按钮时特定数据的详细视图

实际问题是: 当我从文本框或基本上是字符串值中删除或删除汽车类型数据时,“空”值会反映回数据列表。 文本框使用双向模式。 但是,如果删除或清空包含枚举数据或int数据的文本框,空值不会反映回列表,只有当数据为字符串时才会出现问题

下面是从ListView中选择的数据快照:


MVVM体系结构和WPF新手请对我放松:|

您不能将
int
属性或
Country
属性设置为空
字符串

如果将属性定义为可空,则可以将其设置为
null

public class Car
{
    public int? Id { get; set; }
    public string Name{ get; set; }
    public int? Price { get; set; }
    public Country? Country { get; set; }
    public string Type { get; set; }
}

看起来您试图将视图与viewmodel分离(已更改视图,但希望保持viewmodel属性不变),但这只是一种错误的方法

如果您有一个持久化数据列表,并且希望编辑一个项目,而不在保存前将编辑反映在列表中,则需要一个具有单独数据的单独viewmodel。 根据列表项获取初始值,让用户编辑数据,并在保存时将更改后的数据明确写入列表项


如果您希望避免将数据手动复制到编辑器viewmodel或从编辑器viewmodel复制数据,像AutoMapper这样的工具可以在一定程度上简化编辑器项的创建。

终于找到了我想要的解决方案;正如在我的OP中所说的,问题在于,每当我更改绑定到textbox的属性值时,数据都会反射回源(即使数据是空白),无论发生什么情况-您单击update或cancel或关闭表单的窗口上的任何按钮

解决方案:

我将
UpdateSourceTrigger
设置为Explicit

默认情况下,
UpdateSourceTrigger
设置为default,这意味着属性中的值更改会反映回源

UpdateSourceTrigger
设置为Explicit时,这基本上意味着对绑定值所做的更改不会发送回源,即使模式是双向或单向源


检查MSDN关于Binding.updateSourceRigger属性的说明

我觉得
字符串
类型的行为很好。双向绑定意味着
文本框中的值反映了
模型中的值,反之亦然。至于
int
enum
值,它们是值类型,默认值为0,这可能是您没有看到反映的更改的原因。请向我们显示一些代码。例如你的枚举@费利克斯。我不认为发布枚举代码会对我的数据层产生影响,而且与我的MVVM UI空间无关。据我所知,您的问题是绑定到
enum
,因此,xaml中的
binding
和枚举与解决您的问题相关。您应该添加所有相关内容。@StephenWilson那么我如何阻止string将空数据转发回我的主列表?“非常感谢您的建议-我将尝试您的方法。”。。再看看你所谓的解决方案是不是很有说服力。至少,如果您试图以MVVM的方式开发MVVM,您不应该阻止将不完整/错误的数据传输到viewmodel。如果数据保留在视图中而不进行传输,则不会得到模型验证。@grek40你是对的,我确实需要实现验证;然而,只要我能手动控制数据的反向流动,这个解决方案就能帮我解决问题!