C#WPF绑定、ValidationRule和默认值

C#WPF绑定、ValidationRule和默认值,c#,wpf,binding,validationrules,C#,Wpf,Binding,Validationrules,我是WPF和C的新手,我的申请有问题。我有一个文本框,我想有一个ValidationRule来验证文本。现在我想在文本框中有一个默认值,但我不知道怎么做。我已经尝试了很多方法和技巧,当谷歌搜索这个问题时,我发现这些方法和技巧似乎根本不起作用 还有没有办法不用ProjectData类文件就可以做到这一点?对我来说,似乎必须创建一个只有一个值的类才能实现验证 我的ValidationRule如下所示: public class OpcValidationRule : ValidationRule

我是WPF和C的新手,我的申请有问题。我有一个文本框,我想有一个ValidationRule来验证文本。现在我想在文本框中有一个默认值,但我不知道怎么做。我已经尝试了很多方法和技巧,当谷歌搜索这个问题时,我发现这些方法和技巧似乎根本不起作用

还有没有办法不用ProjectData类文件就可以做到这一点?对我来说,似乎必须创建一个只有一个值的类才能实现验证

我的ValidationRule如下所示:

public class OpcValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string source = (string)value;
            if(!source.StartsWith("Test")) 
            {
                return new ValidationResult(false, msg);
            }


            // Valid!!!!
            return new ValidationResult(true, null);
        }
    }
<TextBox x:Name="OPCAddressBox" Style="{StaticResource textBoxInError}" HorizontalAlignment="Right" TextWrapping="NoWrap" VerticalAlignment="Top" Margin="0,10,8,0" Width="150">
                    <TextBox.Text>
                        <Binding Path="OpcServerAddress" Source="{StaticResource pdd}" UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <local:OpcValidationRule />
                            </Binding.ValidationRules>
                        </Binding>
                    </TextBox.Text>
                </TextBox>
<Window.Resources>
        <local:ProjectData Height="1000" Width="1000" OpcServerAddress="opc.tcp://address:port" x:Key="pdd"/>

        <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
public class ProjectData
    {
        private string opcServerAddress;
        public string OpcServerAddress
        {
            get { return opcServerAddress; }
            set { opcServerAddress = value; }
        }

        public ProjectData()
        {
        }
    }
我的文本框如下所示:

public class OpcValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string source = (string)value;
            if(!source.StartsWith("Test")) 
            {
                return new ValidationResult(false, msg);
            }


            // Valid!!!!
            return new ValidationResult(true, null);
        }
    }
<TextBox x:Name="OPCAddressBox" Style="{StaticResource textBoxInError}" HorizontalAlignment="Right" TextWrapping="NoWrap" VerticalAlignment="Top" Margin="0,10,8,0" Width="150">
                    <TextBox.Text>
                        <Binding Path="OpcServerAddress" Source="{StaticResource pdd}" UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <local:OpcValidationRule />
                            </Binding.ValidationRules>
                        </Binding>
                    </TextBox.Text>
                </TextBox>
<Window.Resources>
        <local:ProjectData Height="1000" Width="1000" OpcServerAddress="opc.tcp://address:port" x:Key="pdd"/>

        <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
public class ProjectData
    {
        private string opcServerAddress;
        public string OpcServerAddress
        {
            get { return opcServerAddress; }
            set { opcServerAddress = value; }
        }

        public ProjectData()
        {
        }
    }

您必须知道,通常,如果您希望以“正确”的方式实现WPF应用程序,那么XAML将绑定到ViewModel,并保留属性。 我知道这对于你必须保留在这里的少量财产来说似乎有点沉重,但是相信我,当你有更大的UI时,这真是太棒了。 您还可以查看触发器,它可以帮助您在不添加类的情况下验证某些内容(但如果要验证的字段太多,则会非常繁重) 如果您还没有阅读过这篇文章,我建议您阅读这篇文章,这篇文章确实帮助我更多地了解WPF中的验证:

编辑

对于默认值:

您的项目数据类必须实现接口“INotifyPropertyChanged” 这允许在每次更改文本时触发事件,从而更新绑定。一旦你完成了这项工作(我鼓励你使用Google四处看看,不幸的是,我没有任何具体的文章可以推荐,但你肯定会找到一篇不错的文章),只需在构造函数中初始化你的字符串,如下所示:

public ProjectData()
        {
            opcServerAddress = "Hello!";
        }
然后,由于绑定,文本框将具有您刚才指定的默认值,并且每次修改它时,opcServerAddress值都将按照文本框中的值进行更新。 这将特别允许您在ProjectData类(通常称为ViewModel)中使用此字符串,如果您有时间,请查看MVVM模型:

它非常有用,并且被认为是在WPF中工作的“正确”方式)


玩得开心!:)

感谢大马士革的链接,它帮助我更多地理解WPF验证。然而,我没有找到任何解决我原来问题的方法,在文本框中有一个默认值。哦,对不起,我没有读到这个问题。。。刚刚用一些有用的建议编辑了我的邮件:)非常感谢,现在可以开始了。你的帖子真的帮了我大忙。