gpt4 book ai didi

.net - 使用 IDataErrorInfo 和 MVVM 模式问题进行数据验证

转载 作者:行者123 更新时间:2023-12-03 10:40:16 25 4
gpt4 key购买 nike

在 WPF MVVM 应用程序上使用 IDataErrorInfo 进行数据验证时,我遇到了一个奇怪的问题,我正在做的是:

要验证的属性

public Decimal GlassPrice
{
get
{
return _GlassPrice;
}
set
{
if (_GlassPrice != value)
{
_GlassPrice = value;
OnPropertyChanged("GlassPrice");
CarName = allPropertiesValid.ToString();
}
}
}

“我将在上面的“设置”函数 CarName = .. 等后面解释最后一行”
然后,一个默认值为 false 的 bool 变量表示是否所有要验证的属性都为 true,用于 canExecute 函数。
public bool allPropertiesValid
{

get { return _allPropertiesValid; }
set
{
if (_allPropertiesValid != value)
{
_allPropertiesValid = value;
OnPropertyChanged("allPropertiesValid");
}
}
}

然后是一个字典来保存具有 bool 值的属性名称对,如下所示
 validAllProperties = new Dictionary<string, bool>();
validAllProperties.Add("GlassPrice", false);

那么,当然是一种验证属性的方法如下
private string validateGlassPrice()
{
if (GlassPrice <= 0)
{
return "price can't be 0 nor a minus value ";
}
else
{
return String.Empty;
}
}

然后在 IDataErrorInfo 实现上
string IDataErrorInfo.this[string columnName]
{
get
{
string error = String.Empty;
switch (columnName)
{
case "GlassPrice":
error = validateGlassPrice();
validAllProperties["GlassPrice"] = String.IsNullOrEmpty(error) ? true : false;
validateAllProperties();
return error;
default:
throw new ApplicationException("Wrong Property name being validated");
}

}
}

最后一种设置“allPropertiesValid”最终值的方法取决于字典中的 bool 值
private void validateAllProperties()
{
foreach (bool isValid in validAllProperties.Values)
{
if (isValid == false)
{
allPropertiesValid = false;
return;
}
}
allPropertiesValid = true;
}

我说我稍后会解释的 CarName 是绑定(bind)到文本框的属性,我现在用它来跟踪运行时上的“allPropertiesValid”值,所以我让 canExecute 方法返回“allPropertiesValid”并依赖于与关联的按钮该命令将被启用/禁用,这个场景工作得很好,我已经使用它完成了 3 或 4 个表单并且它们工作得很好,但是在这个特定的表单中它没有,在修改之后,事实证明问题是仅在这个特定的属性“GlassPrice”上,我禁用了对其他属性的所有验证并保留它,现在发生的情况是:当输入 1 作为值时,Carname 给我 false,但现在启用了按钮?只要 CanExecute 方法上的值为 false,则永远不应该启用该按钮,然后我将 0 加到 1,它们变为 10,然后它变为 True,并且无论文本框中的值如何变化,它都保持为 True,即使我输入了一个无效数据,如 0 或 null 它保持为真并且按钮始终处于启用状态??我坐了几个小时试图解决这个问题,我希望有人能帮助我

提前致谢

编辑:
那么现在的问题是:当 TextBox 为空时如何检查 Decimal ??,GlassPrice 是 Decimal 并且 Decimal 不接受空值,以下方法检查 GlassPrice 是否为 0 或减号,但不为空或空白
private string validateGlassPrice()
{
if (GlassPrice <= 0)
{
return "price can't be 0 nor a minus value ";
}
else
{
return String.Empty;
}
}

最佳答案

我看不出您发布的内容有任何明显错误。这里有一些建议可以帮助您找到问题:

首先,您希望看到的行为(启用/禁用按钮)取决于 CanExecute被评估并返回正确的值。这真的发生了吗?找出答案的一个好方法是将消息写入 CanExecute 中的控制台。方法,例如:

Console.WriteLine("CanExecute called; returning " + result);
return result;

然后,您可以在使用程序时将“输出”窗口保留在屏幕上,并查看属性是否在您期望的时候被评估,以及在评估时它是否正在返回您期望的值到。

第二个建议是您开始在 View 模型中使用字符串常量而不是文字。我没有看到您在这里犯了任何错误,但是您发布的代码使用字符串文字 "GlassPrice"在三个不同的地方。如果其中任何一个拼写错误,您的代码将以您意想不到的方式失败。

最后,两个风格问题——这些不是问题的根源,但它们会简化你的代码。这:
validAllProperties["GlassPrice"] = String.IsNullOrEmpty(error) ? true : false;

应该是这样的:
validAllProperties["GlassPrice"] = String.IsNullOrEmpty(error);

还有这个:
foreach (bool isValid in validAllProperties.Values)
{
if (isValid == false)
{
allPropertiesValid = false;
return;
}
}
allPropertiesValid = true;

可以很容易地这样:
allPropertiesValid = validAllProperties.Values.All(x => x);

关于.net - 使用 IDataErrorInfo 和 MVVM 模式问题进行数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com