/ / C # WPF Bindings, ValidationRule и стойност по подразбиране - c #, wpf, binding, validationrules

C # WPF Bindings, ValidationRule и стойност по подразбиране - c #, wpf, binding, validationrules

Аз нов в WPF и C # и имам проблем с мояприложение. Имам TextBox, който искам да има ValidationRule за валидиране на текста. Сега искам да има стойност по подразбиране в TextBox, но аз не мога да "разбера как да го направя. Аз се опитах много начини и съвети, които намирам, когато googling проблема не изглежда да работи на всички.

Също така има ли някакъв начин да направите това без използването на файл 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);
}
}

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

Отговори:

3 за отговор № 1

Трябва да знаете това обикновено, ако искатереализирате WPF приложението с "правилния" начин, вашите XAML ще бъдат свързани с ViewModel, запазвайки свойствата. Знам, че изглежда доста тежък за малкото имущество, което трябва да държите тук, но повярвайте ми, това е страхотно, когато имате по-големи потребителски интерфейси. Можете също така да се огледате около тригерите, които могат да ви помогнат да потвърдите нещо, без да добавяте клас (но би било много тежко, ако имате много полета за валидиране) Бих ви посъветвал да разгледате тази статия, която наистина ми помогна да науча повече за валидирането в WPF, ако не сте го прочели:

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

РЕДАКТИРАНЕ

За стойността по подразбиране:

Класът на данните за вашия проект трябва да въведеинтерфейс "INotifyPropertyChanged" Това позволява да се изстрелва събитие всеки път, когато текстът се променя и следователно да се актуализира свързването. След като сте направили това (аз ви препоръчвам да се огледате с помощта на Google, за съжаление нямам никаква конкретна статия, която да ви предложа, но вие ще намерите хубава една със сигурност), просто инициализирайте вашия низ в конструктора, нещо така:

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

След това, благодарение на свързването, текстовото поле ще бъдеимате стойността по подразбиране, която току-що сте посочили, и всеки път, когато я променяте, стойността на opcServerAddress ще бъде актуализирана след стойността в текстовото поле. Това по-специално ще ви позволи да използвате този низ в клас ProjectData (обикновено се нарича ViewModel, ако имате време, проверете модела MVVM: Нуждаете се от добър MVVM урок за WPF

MVVM: Инструкция от начало до край? това е много полезно и се счита за "правилния" начин за работа в WPF)

Забавлявай се! :)