【问题标题】:C# WPF Bindings, ValidationRule and default valueC# WPF 绑定、ValidationRule 和默认值
【发布时间】:2011-07-22 17:53:39
【问题描述】:

我是 WPF 和 C# 新手,但我的应用程序有问题。我有一个 TextBox,我想在其上使用 ValidationRule 来验证文本。现在我想在 TextBox 中有一个默认值,但我不知道该怎么做。我尝试了很多方法,在谷歌搜索问题时发现的提示似乎根本不起作用。

还有什么方法可以在不使用 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>

我的 ProjectData 文件如下所示:

public class ProjectData
    {
        private string opcServerAddress;
        public string OpcServerAddress
        {
            get { return opcServerAddress; }
            set { opcServerAddress = value; }
        }

        public ProjectData()
        {
        }
    }

【问题讨论】:

    标签: c# wpf binding validationrules


    【解决方案1】:

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

    http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

    编辑

    对于默认值:

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

    public ProjectData()
            {
                opcServerAddress = "Hello!";
            }
    

    然后,由于绑定,文本框将具有您刚刚指定的默认值,并且每次修改它时, opcServerAddress 的值都会跟随文本框中的值更新。 这将特别允许您在 ProjectData 类中使用此字符串(通常称为 ViewModel,如果您有时间,请查看 MVVM 模型: Need good MVVM tutorial for WPF

    MVVM: Tutorial from start to finish? 它非常有用,被认为是在 WPF 中工作的“正确”方式)

    玩得开心! :)

    【讨论】:

    • 感谢大马士革的链接,它帮助我更多地了解 WPF 验证。但是,我没有找到任何解决方案来解决我原来的问题,在文本框中有一个默认值。
    • 哦,抱歉,我还没有阅读这个问题...刚刚编辑了我的消息并提供了一些有用的建议 :)
    • 非常感谢,现在可以使用了。你的帖子真的帮了我很大的忙。
    猜你喜欢
    • 2011-01-15
    • 2010-11-08
    • 2018-11-25
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多