Как добиться условной проверки с IDataErrorInfo
У нас есть страница настроек конфигурации в моем приложении MVVM. Одно из полей (Property: 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);
}
}
1 ответ
Сначала я был смущен, почему вы вообще получаете какую-либо ошибку при редактировании пути. Тогда я заметил обновления источника привязки. У тебя есть
UpdateSourceTrigger=PropertyChanged
Это делает проверку, поскольку они печатают каждую букву. Я не вижу, как это хороший план. Если вы удалите это, то привязка будет перенесена на потерянный фокус, и они получат возможность печатать весь путь. Он загорится только в том случае, если они введут неверный путь.
Возможно, вам следует рассмотреть средство выбора файлов, а не текстовое поле.