C# 验证用户控件';通过窗口';视图模型
假设我创建了自定义的LoginForm作为C# 验证用户控件';通过窗口';视图模型,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,假设我创建了自定义的LoginForm作为UserControl,它由TextBox和PasswordBox组成文本框已安装自定义错误模板。当然,我希望这个LoginForm尽可能可重用,因此我想将验证逻辑与这个LoginForm分开 问题是,如果我将LoginForm的文本属性绑定到ViewModel:IDataErrorInfo的“验证属性”,即设置为窗口的数据上下文,ErrorTemplate未应用于LoginForm的文本框,即使我从ViewModel的验证程序中看到调试日志 如何通过独
UserControl
,它由TextBox
和PasswordBox
组成<代码>文本框已安装自定义错误模板
。当然,我希望这个LoginForm尽可能可重用,因此我想将验证逻辑与这个LoginForm分开
问题是,如果我将LoginForm的文本属性绑定到ViewModel:IDataErrorInfo的“验证属性”,即设置为窗口
的数据上下文
,ErrorTemplate
未应用于LoginForm的文本框
,即使我从ViewModel的验证程序中看到调试日志
如何通过独立ViewModel验证可重用组件的子控件?在应用程序资源中使用此错误模板:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="0.8">
<AdornedElementPlaceholder Name="adornerPlaceholder"></AdornedElementPlaceholder>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
在应用程序资源中使用此错误模板:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="0.8">
<AdornedElementPlaceholder Name="adornerPlaceholder"></AdornedElementPlaceholder>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
经过数小时的努力,我想出了以下解决方案,满足了我的需求,因此MVVM模式:
UserControl
中创建类型为IDataErrorInfo
的DepdencProperty
,该属性稍后将由您的视图模型实现(出于我的目的,我使用了ISignUpValidator:IDataErrorInfo和UsernameValue属性)。
假设该属性是以名称Validator注册的(作为默认值,我使用了接口的“不做任何事情”实现)UserControl
的TextBox.Text
属性绑定到验证程序属性:
假设TextBox.Text
属性在名称下暴露给UserControl
用户名:
Username="{Binding Path=Validator.UsernameValue, ElementName=UserControlName,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True}"
用户控件
的验证器属性
<Window.Resources>
<local:ViewModel x:Key="ViewModel"/>
<Window.Resources>
<local:LoginForm Validator={StaticResource ViewModel}>
经过数小时的努力,我找到了以下解决方案,满足了我的需求,因此MVVM模式:
UserControl
中创建类型为IDataErrorInfo
的DepdencProperty
,该属性稍后将由您的视图模型实现(出于我的目的,我使用了ISignUpValidator:IDataErrorInfo和UsernameValue属性)。
假设该属性是以名称Validator注册的(作为默认值,我使用了接口的“不做任何事情”实现)UserControl
的TextBox.Text
属性绑定到验证程序属性:
假设TextBox.Text
属性在名称下暴露给UserControl
用户名:
Username="{Binding Path=Validator.UsernameValue, ElementName=UserControlName,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True}"
用户控件
的验证器属性
<Window.Resources>
<local:ViewModel x:Key="ViewModel"/>
<Window.Resources>
<local:LoginForm Validator={StaticResource ViewModel}>
您好,我已经有一个自定义的ErrorTemplate,如果我在控件级别执行验证,它可以在textbox上工作。我的问题是,我想把验证提升到更高的层次。看起来,usercontrol的子控件没有意识到它的父控件的错误。我正在寻找一些解决方案来实现这一点。嗨,我已经有一个自定义的ErrorTemplate,如果我在控制级别执行验证,它可以在textbox上工作。我的问题是,我想把验证提升到更高的层次。看起来,usercontrol的子控件没有意识到它的父控件的错误。我正在寻找一些解决办法,如何做到这一点。