gpt4 book ai didi

c# - 在 WPF 中同时验证多个控件

转载 作者:行者123 更新时间:2023-11-30 16:23:43 24 4
gpt4 key购买 nike

我有一个包含两个密码字段的表单 - 一个是用户输入密码的地方,另一个是用户必须重新输入密码以确认的地方。验证用于确认两个密码是否匹配 - 如果匹配,将启用一个按钮以允许用户继续:

<PasswordBox Name="P1Box" src:PasswordBoxAssistant.BindPassword="True">
<src:PasswordBoxAssistant.BoundPassword>
<Binding Source="{StaticResource mybinding}" Path="Password.P1" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</src:PasswordBoxAssistant.BoundPassword>
</PasswordBox>

按钮样式:

<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=P1Box, Path=(Validation.HasError)}" Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true"/>
</MultiDataTrigger>
</Style.Triggers>

我的问题是用户可以更改第一个密码框的密码,但不会强制第二个密码框重新验证。例如,如果第一个密码输入为“password”,而用户在第二个框中输入“password”,则验证通过并启用该按钮。如果用户随后将原始密码框更改为“PASSWORD”,则两个框都保持有效 - 原始密码是因为对非空密码没有限制,第二个密码框没有强制更新验证。

我的密码框使用概述的附加属性 here允许绑定(bind)到密码。因此,我找不到以 this solution. 中表达的方式在代码隐藏中访问它的方法(因为 PasswordBox.Password 本身不是依赖属性)或者,也许它只是对附加属性不起作用——下面的代码没有做任何事情:

P2Box.GetBindingExpression(PasswordBoxAssistant.BoundPassword).UpdateSource();

我有一个继承 IDataErrorInfo 的自定义类,以允许在两个控件之间进行验证 - 绑定(bind)是一个 PasswordData 对象,密码框设置为 PasswordData.P1 和 PasswordData.P2:

public class PasswordData : IDataErrorInfo
{
public string P1 { get; set; }
public string P2 { get; set; }
public string Error { get { return string.Empty; } }
public string this[string propertyName]
{
get
{
string ret;
if (propertyName == "P1")
{
if (P1 == null || P1 == "")
ret = "Password cannot be null or empty.";
else
ret = "";
}
else if (propertyName == "P2")
{
if (P2 == null || P2 == "")
ret = "Password cannot be null or empty.";
else if (P2 != P1)
ret = "The passwords do not match.";
else
ret = "";
}
return ret;
}
}
}

我尝试在 PasswordChanged 事件期间跳入,创建一个新的 PasswordData,并重新分配绑定(bind)。这解决了验证问题,但密码框中的插入符总是在最开始,破坏了所有输入的数据。

我想要一个仅限 xaml 的解决方案,但代码隐藏是完全可以接受的。如果重要的话,我正在使用 .Net 4.0。

编辑:

好的,事实证明我在 xaml 中输入了错误的事件处理程序,而解决方案确实有效:

private void PasswordChanged(object sender, RoutedEventArgs e)
{
binding.Pass.P1 = ((PasswordBox)sender).Password;
P2Box.GetBindingExpression(PasswordBoxAssistant.BoundPassword).UpdateSource();
}

我必须手动更新绑定(bind),因为事件会在绑定(bind)更新之前触发。

我很好奇是否有一种正确的、仅限 XAML 的方法使用验证规则、IDataErrorInfo 或其他一些方法在控件之间进行绑定(bind),而无需挂接到事件并手动更新。

最佳答案

对于更复杂的验证,通常需要将验证推送到 ViewModel,甚至在许多情况下甚至是模型。 IDataErrorInfo 是一个好的开始。

这是一篇有关该主题的优秀文章的链接:
http://msdn.microsoft.com/en-us/magazine/ff714593.aspx

关于c# - 在 WPF 中同时验证多个控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317242/

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