簡體   English   中英

C#WPF綁定,ValidationRule和默認值

[英]C# WPF Bindings, ValidationRule and default value

我是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()
        {
        }
    }

您必須知道,通常,如果您想以“正確”的方式實現WPF應用程序,則XAML將綁定到ViewModel,並保留屬性。 我知道這對於您必須保留在此處的少量屬性似乎有點沉重,但是請相信我,當您擁有較大的UI時,這真棒。 您還可以查看有關觸發器的信息,該觸發器可以幫助您無需添加類就可以驗證某些內容(但是如果您有很多要驗證的字段,那將非常繁瑣)。我建議您閱讀這篇文章,它確實幫助我在WPF,如果您尚未閱讀它:

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

編輯

對於默認值:

您的Project數據類必須實現“ INotifyPropertyChanged”接口,該接口允許每次更改文本時觸發一個事件,從而更新綁定。 完成此操作后(建議您使用Google環顧四周,不幸的是,我沒有任何具體的文章可以建議,但您肯定會找到不錯的文章),只需在構造函數中初始化字符串即可像那樣:

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

然后,由於有了綁定,文本框將具有您剛指定的默認值,並且每次對其進行修改時,opcServerAddress值將在文本框中的值之后進行更新。 這將特別允許您在ProjectData類中使用此字符串(通常稱為ViewModel,如果您有時間,請查看MVVM模型: WPF需要良好的MVVM教程

MVVM:教程從頭到尾? 這非常有用,並且被認為是在WPF中“正確”的工作方式)

玩得開心! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM