Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 如何通过tabcontrol tabitem selection change重新更新文本框验证_C#_Wpf_Prism - Fatal编程技术网

C# 如何通过tabcontrol tabitem selection change重新更新文本框验证

C# 如何通过tabcontrol tabitem selection change重新更新文本框验证,c#,wpf,prism,C#,Wpf,Prism,在将实体保存到数据库之前,我必须验证一些属性 问题: <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism

在将实体保存到数据库之前,我必须验证一些属性

问题:

<Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525">
    <StackPanel>
        <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
        <TabControl>
        <TabItem>
         <TabItem.Content>
             <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
         </TabItem.Content>
        </TabItem>
            <TabItem>
                <TabItem.Content>
                   <TextBlock Text="TabItem2"></TextBlock>
                </TabItem.Content>
            </TabItem>

        </TabControl>
    </StackPanel>
</Window>
using System.ComponentModel.DataAnnotations;
using Prism.Mvvm;
using Prism.Validation;

namespace PrismUnityApp1TestValidation.ViewModels
{
    public class MainWindowViewModel : ValidatableBindableBase
    {
        private string _title = "Prism Unity Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _testtext;
        [Required]
        public string TestText
        {
            get { return _testtext; }
            set { SetProperty(ref _testtext, value); }
        }


        public MainWindowViewModel()
        {

        }
    }
}
<Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525">
    <StackPanel>
        <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
        <TabControl>
        <TabItem IsSelected="{Binding TabItem1Selected}">
         <TabItem.Content>
             <AdornerDecorator>
                 <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
                    </AdornerDecorator>

         </TabItem.Content>
        </TabItem>
            <TabItem>
                <TabItem.Content>
                   <TextBlock Text="TabItem2"></TextBlock>
                </TabItem.Content>
            </TabItem>

        </TabControl>
    </StackPanel>
</Window>
  • Programmstart:在tabitem1中显示文本框的验证错误
  • 用户在视图中选择:Tabitem2
  • 用户在视图中选择:Tabitem1
  • 空文本框的验证错误不再显示在tabitem1中 例外行为:

    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem>
             <TabItem.Content>
                 <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    using System.ComponentModel.DataAnnotations;
    using Prism.Mvvm;
    using Prism.Validation;
    
    namespace PrismUnityApp1TestValidation.ViewModels
    {
        public class MainWindowViewModel : ValidatableBindableBase
        {
            private string _title = "Prism Unity Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            private string _testtext;
            [Required]
            public string TestText
            {
                get { return _testtext; }
                set { SetProperty(ref _testtext, value); }
            }
    
    
            public MainWindowViewModel()
            {
    
            }
        }
    }
    
    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem IsSelected="{Binding TabItem1Selected}">
             <TabItem.Content>
                 <AdornerDecorator>
                     <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
                        </AdornerDecorator>
    
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    如果用户更改所选选项卡项,则每次也应显示验证错误

    使用的工具/框架:

    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem>
             <TabItem.Content>
                 <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    using System.ComponentModel.DataAnnotations;
    using Prism.Mvvm;
    using Prism.Validation;
    
    namespace PrismUnityApp1TestValidation.ViewModels
    {
        public class MainWindowViewModel : ValidatableBindableBase
        {
            private string _title = "Prism Unity Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            private string _testtext;
            [Required]
            public string TestText
            {
                get { return _testtext; }
                set { SetProperty(ref _testtext, value); }
            }
    
    
            public MainWindowViewModel()
            {
    
            }
        }
    }
    
    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem IsSelected="{Binding TabItem1Selected}">
             <TabItem.Content>
                 <AdornerDecorator>
                     <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
                        </AdornerDecorator>
    
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
  • Prism 6.3(具有Templatepack PrismUnity的新项目
  • Prism.Validation()
  • 问题:

    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem>
             <TabItem.Content>
                 <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    using System.ComponentModel.DataAnnotations;
    using Prism.Mvvm;
    using Prism.Validation;
    
    namespace PrismUnityApp1TestValidation.ViewModels
    {
        public class MainWindowViewModel : ValidatableBindableBase
        {
            private string _title = "Prism Unity Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            private string _testtext;
            [Required]
            public string TestText
            {
                get { return _testtext; }
                set { SetProperty(ref _testtext, value); }
            }
    
    
            public MainWindowViewModel()
            {
    
            }
        }
    }
    
    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem IsSelected="{Binding TabItem1Selected}">
             <TabItem.Content>
                 <AdornerDecorator>
                     <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
                        </AdornerDecorator>
    
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
  • 为什么在不同选项卡项之间选择后不再显示DataAnnoation?ViewModel属性hasErrors为true
  • 如果用户再次选择tabitem1,如何重新启动评估
  • 查看:

    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem>
             <TabItem.Content>
                 <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    using System.ComponentModel.DataAnnotations;
    using Prism.Mvvm;
    using Prism.Validation;
    
    namespace PrismUnityApp1TestValidation.ViewModels
    {
        public class MainWindowViewModel : ValidatableBindableBase
        {
            private string _title = "Prism Unity Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            private string _testtext;
            [Required]
            public string TestText
            {
                get { return _testtext; }
                set { SetProperty(ref _testtext, value); }
            }
    
    
            public MainWindowViewModel()
            {
    
            }
        }
    }
    
    <Window x:Class="PrismUnityApp1TestValidation.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" Height="350" Width="525">
        <StackPanel>
            <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
            <TabControl>
            <TabItem IsSelected="{Binding TabItem1Selected}">
             <TabItem.Content>
                 <AdornerDecorator>
                     <TextBox Height="50" Text="{Binding TestText, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></TextBox>
                        </AdornerDecorator>
    
             </TabItem.Content>
            </TabItem>
                <TabItem>
                    <TabItem.Content>
                       <TextBlock Text="TabItem2"></TextBlock>
                    </TabItem.Content>
                </TabItem>
    
            </TabControl>
        </StackPanel>
    </Window>
    
    ValidatableBindableBase(NugetPackage Prism.Validation):

    namespace Prism.Validation
    {
    /// 
    ///创建IValidatableBindableBase接口是为了为包含验证规则的模型类添加验证支持。
    ///IValidatableBindableBase的默认实现是ValidatableBindableBase类,它包含运行
    ///实例,并将此验证的结果作为属性错误列表返回。
    /// 
    //有关验证用户输入的文档位于http://go.microsoft.com/fwlink/?LinkID=288817&clcid=0x409
    公共类ValidatableBindableBase:BindableBase、IValidatableBindableBase、INotifyDataErrorInfo
    {
    私有只读BindableValidator\u BindableValidator;
    /// 
    ///初始化类的新实例。
    /// 
    公共ValidatableBindableBase()
    {
    _bindableValidator=新的bindableValidator(此);
    }
    /// 
    ///获取或设置一个值,该值指示此实例是否已启用验证。
    /// 
    /// 
    ///如果为此实例启用了验证,则为true;否则为false。
    /// 
    已启用公共布尔值验证
    {
    获取{return}bindableValidator.IsValidationEnabled;}
    设置{u bindableValidator.IsValidationEnabled=value;}
    }
    /// 
    ///返回具有索引器属性的BindableValidator实例。
    /// 
    /// 
    ///可绑定验证程序索引器属性。
    /// 
    公共BindableValidator错误
    {
    得到
    {
    返回bindableValidator;
    }
    }
    /// 
    ///获取一个值,该值指示实体是否存在验证错误。
    /// 
    /// 
    ///如果此实例包含验证错误,则为true;否则为false。
    /// 
    公共布尔错误
    {
    得到
    {
    return!ValidateProperties();
    }
    }
    /// 
    ///由于添加了新错误或修复了旧错误而更改错误集合时发生。
    /// 
    公共事件事件处理程序错误更改
    {
    添加{u bindableValidator.ErrorsChanged+=value;}
    删除{u bindableValidator.ErrorsChanged-=value;}
    }
    /// 
    ///获取所有错误。
    /// 
    ///ReadOnlyDictionary的键是属性名,值是错误字符串的只读集合。
    public ReadOnlyDictionary GetAllErrors()
    {
    返回_bindablevalidater.GetAllErrors();
    }
    /// 
    ///验证当前实例的属性。
    /// 
    /// 
    ///如果所有属性都通过验证规则,则返回true;否则返回false。
    /// 
    公共bool ValidateProperties()
    {
    返回_bindablevidator.ValidateProperties();
    }
    /// 
    ///使用当前实例的给定名称验证单个属性。
    /// 
    ///要验证的属性。
    ///如果属性通过验证规则,则返回true;否则返回false。
    public bool ValidateProperty(字符串属性名称)
    {
    return!\u bindableValidator.IsValidationEnabled//如果禁用验证,请不要失败
    ||\u bindableValidator.ValidateProperty(propertyName);
    }
    /// 
    ///设置此实例的错误集合。
    /// 
    ///实体错误。
    公共无效设置错误(IDictionary entityErrors)
    {
    _bindableValidator.SetAllErrors(entityErrors);
    }
    /// 
    ///检查属性是否已与所需值匹配。设置属性并
    ///仅在必要时通知侦听器。我们将重写此属性以确保在
    ///确定性方法。
    /// 
    ///属性的类型。
    ///对同时具有getter和setter的属性的引用。
    ///属性的所需值。
    ///用于通知侦听器的属性的名称。此
    ///值是可选的,可以在从以下编译器调用时自动提供:
    ///支持CallerMemberName。
    /// 
    ///如果值已更改,则为True;如果现有值与
    ///期望值。
    /// 
    受保护的重写bool SetProperty(ref T storage,T value,[CallerMemberName]string propertyName=null)
    {
    var result=base.SetProperty(参考存储、值、属性名称);
    if(result&!string.IsNullOrEmpty(propertyName))
    {
    if(_bindableValidator.IsValidationEnabled)
    {
    _bindableValidator.ValidatePro