1

私は WPF と C# を初めて使用し、アプリケーションに問題があります。テキストを検証するために ValidationRule を設定したい TextBox があります。TextBox にデフォルト値を設定したいのですが、その方法がわかりません。私は多くの方法を試しましたが、問題をグーグルで調べたときに見つけたヒントはまったく機能していないようです。

また、ProjectData クラス ファイルを使用せずにこれを行う方法はありますか? 私には、検証を達成できるようにするために、値が1つだけのクラスを作成する必要があるのは奇妙に思えます。

私の 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 は次のようになります。

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

1 に答える 1

3

通常、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 で作業するための「適切な」方法であると考えられています)。

楽しむ!:)

于 2011-03-25T08:57:21.293 に答える