У нас есть страница настроек конфигурации в моем приложении MVVM. Одно из полей (свойство: BackupFolderPath) здесь имеет элемент управления TextBox. Мы выполнили проверку этого элемента управления с помощью IDataErrorInfo. Валидация в основном проверяет существование этого пути.
Какие валидации были реализованы:
При запуске приложения проверяется наличие BackupFolderPath. Если этот путь не существует, приложение перейдет на страницу настроек и пометит границу элемента управления красным цветом.
Если пользователь находится на странице настроек и BackupFolderPath существует. Теперь, если мы попытаемся изменить BackupFolderPath, проверка снова вступит в силу и цвет границы элемента управления станет красным.
Что мы хотим изменить сейчас:
- Мы хотим сохранить красный цвет границы только при запуске приложения, если путь не существует. Во втором случае, если путь существует, но пользователь пытается изменить его из пользовательского интерфейса, мы не хотим вызывать проверку, которая означает, что цвет границы текстового поля не должен меняться на красный. Мы хотим, чтобы пользователь мог изменить путь здесь.
Фрагмент кода XAML:
<UserControl.Resources>
<!--—Error Template to change the default behaviour-->
<ControlTemplate x:Key="ErrorTemplate">
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<!-- —To display tooltip with the error-->
<Style TargetType="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>
</UserControl.Resources>
<TextBox x:Name="txtBackupFilePath" Text="{Binding Path=BackupFolderPath,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Validation.ErrorTemplate="{StaticResource ErrorTemplate}" Grid.Column="1" Grid.Row="4" Margin="0,0,155,0" Height="30" Width="500" TextWrapping="NoWrap" MaxLength="75" HorizontalAlignment="Left"/>
Фрагмент кода ViewModel:
#region IDataErrorInfo Implementation
public new string Error
{
get { return null; }
}
public new string this[string columnName]
{
get
{
string result = null;
switch (columnName)
{
case "BackupFolderPath":
if (!Directory.Exists(BackupFolderPath))
result = "Configuration settings path: \'" + BackupFolderPath+ "\' not available !";
break;
default:
break;
}
return result;
}
}
#endregion
private string _backupFolderPath = string.Empty;
public string BackupFolderPath
{
get { return _backupFolderPath ; }
set
{
if (_backupFolderPath == value) return;
_backupFolderPath = value;
NotifyOfPropertyChange(() => BackupFolderPath);
}
}
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), MyCompanyName, MyApplicationName)
и покончить с этим. - person   schedule 27.03.2018