我们试图在mvvm中找到验证,在业务逻辑或模型中进行验证。我已经在业务逻辑中实现了类型--这里可以找到一个简化的图表:

如果我们有很多相互独立的输入,没有问题,异常会抛出,文本框会捕捉到它的标记,每个错误输入的边框都是红色的。然而,当我们有了依赖的价值,我们就有麻烦了。例如:
模型中的
是否有一个共同的模式来解决这个问题?我们不想在两个文本框之间的GUI中引入依赖项,因为这个逻辑应该只存在于业务逻辑层。
除了实现validate之外,还可以实现IDataErrorInfo接口,但问题仍然存在,因此无法强制依赖值再次验证它们的值,至少我看不到:)
任何帮助都是非常感谢的。
干杯,曼尼
清除,删除必要的步骤
15.11.2010 - Part2
好吧,重新考虑一下,我们要用商业逻辑层。下面是我们当前计划的配置:

(这里的图像有点小,请在一个单独的窗口上打开它,显示它的大小)一切或多或少都很清楚,除了如果业务逻辑下的数据模型发生了变化,如何通知不同编辑器的所有视图模型/模型克隆。一种方法是跟踪创建它们的业务逻辑中的克隆模型。当使用业务逻辑commit()更改数据模型时,所有其他已注册模型克隆都可以被通知并进一步传播。或者,业务逻辑可以发布所有视图模型都订阅的事件,这样它们也可以得到更改--有人能给我一个提示吗?还有什么更好呢?
再次感谢你的帮助,对不起我被困住了;)
发布于 2010-11-11 08:57:02
您可以考虑使用System.ComponentModel.IDataErrorInfo接口。这个非常方便的界面使您能够:
您可以在视图模型上(甚至在视图模型库中实现IDataErrorInfo,并在派生的视图模型中重写它)。由于数据绑定的性质,我需要检查的值都在视图模型中,我可以测试它们的任何组合。当然,您的业务层中仍然有您的验证,但是您不再需要仅仅为了进行一些验证而访问您的业务层(或模型)。
下面是一个来自(WPF)屏幕的快速示例,它收集了一些用户详细信息,并对它们进行了基本验证:
C#代码:
#region IDataErrorInfo Members
/// <summary>
/// Gets an error message indicating what is wrong with this object.
/// </summary>
/// <value></value>
/// <returns>An error message indicating what is wrong with this object. The default is an empty string ("").</returns>
public override string Error
{
get
{
return this["UserCode"] + this["UserName"] + this["Password"] + this["ConfirmedPassword"] + this["EmailAddress"];
}
}
/// <summary>
/// Gets the <see cref="System.String"/> with the specified column name.
/// </summary>
/// <value></value>
public override string this[string columnName]
{
get
{
switch (columnName)
{
case "UserCode":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 20)
return "User Code must be less than or equal to 20 characters";
break;
case "UserName":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 60)
return "User Name must be less than or equal to 60 characters";
break;
case "Password":
if (!string.IsNullOrEmpty(Password) && Password.Length > 60)
return "Password must be less than or equal to 60 characters";
break;
case "ConfirmedPassword":
if (Password != ConfirmedPassword)
return Properties.Resources.ErrorMessage_Password_ConfirmedPasswordDoesntMatch;
break;
case "EmailAddress":
if (!string.IsNullOrEmpty(EmailAddress))
{
var r = new Regex(_emailRegex);
if (!r.IsMatch(EmailAddress))
return Properties.Resources.ErrorMessage_Email_InvalidEmailFormat;
}
break;
}
return string.Empty;
}
}
#endregion下面是页面上两个文本框的XAML标记(特别是ValidatesOnDataErrors绑定中的ValidatesOnExceptions和Text属性):
<TextBox Name="UserCodeTextBox"
Text="{Binding UserCode,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,0,150,0"
CharacterCasing="Upper"
/>
<TextBox Name="UserNameTextBox"
Text="{Binding UserName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,30,0,0"
/>发布于 2015-08-21 20:03:03
有一个共同的模式来解决这个问题吗?我们不想在两个文本框之间的GUI中引入依赖项,因为这个逻辑应该只存在于业务逻辑层。
Value1和Value2是相互依存的,因为“模型中的Value1和Value2是不一样的”。Value2发生变化时,Value1也会发生变化,也会发生相反的变化!实际上,当statement.Value1更改时,Value1验证结果会发生变化,但这与以前的Value2设置器必须同时通知Value1和Value2属性更改有关。WPF是否会这样做。H 223G 224https://stackoverflow.com/questions/4152346
复制相似问题