我的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);
}
}
答案 0 :(得分:0)
我最初很困惑,为什么在编辑路径时你会收到任何错误。 然后我注意到绑定的updatesourcetrigger。
UpdateSourceTrigger=PropertyChanged
当他们输入每个字母时,它正在进行检查。我看不出这是一个好计划。 如果你删除它,那么绑定将在失去焦点时传输,他们将输入整个路径。只有当它们放入无效路径时才会亮起。
也许你应该考虑使用filepicker而不是文本框。