Привязки C# WPF, ValidationRule и значение по умолчанию

Я новичок в 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 выглядит так:

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

person chiefi    schedule 25.03.2011    source источник


Ответы (1)


Вы должны знать, что обычно, если вы хотите реализовать приложение WPF "правильным" способом, ваши XAML будут привязаны к ViewModel, сохраняя свойства. Я знаю, что это кажется немного тяжелым для небольшого количества имущества, которое вы должны хранить здесь, но поверьте мне, это здорово, когда у вас есть большие пользовательские интерфейсы. Вы также можете просмотреть триггеры, которые могут помочь вам проверить что-то без добавления класса (но это будет ОЧЕНЬ тяжело, если у вас много полей для проверки). Я бы посоветовал вам проверить эту статью, которая действительно помогла мне узнать больше о проверке в WPF, если вы еще не читали:

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

ИЗМЕНИТЬ

Для значения по умолчанию:

Ваш класс данных Project должен реализовать интерфейс «INotifyPropertyChanged». Это позволяет запускать событие каждый раз при изменении текста и, следовательно, обновлять привязку. Как только вы это сделаете (рекомендую вам поискать в Google, к сожалению, у меня нет конкретной статьи, которую можно было бы предложить, но вы наверняка найдете хорошую), просто инициализируйте свою строку в конструкторе, что-нибудь как это:

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

Затем, благодаря привязке, текстовое поле будет иметь значение по умолчанию, которое вы только что указали, и каждый раз, когда вы его изменяете, значение opcServerAddress будет обновляться в соответствии со значением в текстовом поле. Это особенно позволит вам использовать эту строку в классе ProjectData (обычно называемом ViewModel, если у вас есть время, ознакомьтесь с моделью MVVM: Нужно хорошее руководство по MVVM для WPF

MVVM: учебник от начала до конца? это очень полезно, и это считается "правильным" способом работы в WPF)

Развлекайся! :)

person Damascus    schedule 25.03.2011
comment
Спасибо за эту ссылку, Дамаск, она помогла мне лучше понять проверку WPF. Однако я не нашел там никакого решения для моей первоначальной проблемы, чтобы иметь значение по умолчанию в текстовом поле. - person chiefi; 25.03.2011
comment
Ой, извините, я не читал эту задачу... Просто отредактировал свое сообщение с некоторыми полезными советами :) - person Damascus; 25.03.2011
comment
Большое спасибо, теперь все работает. Ваш пост мне очень помог. - person chiefi; 26.03.2011