Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证用户控件';通过窗口';视图模型_C#_Wpf_Validation_Mvvm - Fatal编程技术网

C# 验证用户控件';通过窗口';视图模型

C# 验证用户控件';通过窗口';视图模型,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,假设我创建了自定义的LoginForm作为UserControl,它由TextBox和PasswordBox组成文本框已安装自定义错误模板。当然,我希望这个LoginForm尽可能可重用,因此我想将验证逻辑与这个LoginForm分开 问题是,如果我将LoginForm的文本属性绑定到ViewModel:IDataErrorInfo的“验证属性”,即设置为窗口的数据上下文,ErrorTemplate未应用于LoginForm的文本框,即使我从ViewModel的验证程序中看到调试日志 如何通过独

假设我创建了自定义的LoginForm作为
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的子控件没有意识到它的父控件的错误。我正在寻找一些解决办法,如何做到这一点。