我有一个TextBox
绑定到IPAddress
财产。为此,我实施了一个IValueConverter
,试图将string
的TextBox
解析为IPAddress
。转换失败时,会在TextBox
周围自动绘制红色边框,表示给定值不正确。到目前为止,这是有效的。
我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到IsEnabled
的Button
属性。以及XAML中的所有内容。
这里IValueConverter
:
public class IpAddressConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is IPAddress)
{
return ((IPAddress)value).ToString();
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
{
IPAddress ipAddress;
if (IPAddress.TryParse((string)value, out ipAddress))
{
return ipAddress;
}
}
return false;
}
}
编辑:我已经实现了逻辑来验证输入。但由于转换失败,该属性不会更新。这意味着该属性仍然保留“旧”值,这当然是正确的,但不需要验证。
也许你可以使用Validation Attached Properties和DataTrigger
放在你的Button
上,只需要对你的XAML采取行动:
<TextBox Name="ipAddressTextBox" Text="{Binding IP, Converter={StaticResource IpAddressConverter}}" />
<Button Content="Ok">
<Button.Style>
<Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ipAddressTextBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
当然假设ipAddressTextBox
是你的TextBox
。我希望它有所帮助。
在这种情况下,将转换逻辑从字符串插入到ViewModel中的IPAdress将允许您从XAML中删除转换标记,同时让您处理转换的成功/失败状态。
例如:
public class IPAddressEntryViewModel : ViewModel
{
private IPAddress ip;
private bool isValidIp;
public bool IsValidIp
{
get { return isValidIp; }
set
{
if(isValidIp!= value)
{
isValidIp= value;
NotifyPropertyChanged("IsValidIp");
}
}
}
private string ipAddressText;
public string IPAddressText
{
get { return ipAddressText; }
set
{
if(ipAddressText != value)
{
ipAddressText = value;
NotifyPropertyChanged("IPAddressText");
//Parsing
IsValidIp= IPAddress.TryParse(ipAddressText, out ip);
}
}
}
}
然后只需将按钮的IsEnabled
绑定到IsValidIp
,将TextBox的Text
绑定到IPAddressText
。您还可以使用DataTrigger设置边框样式以跟随IsValidIp
,从而为您节省大量XAML标记。
这也允许您在将来给出TextBox文本时执行您可能需要执行的任何其他处理。