C# 将失败的IValueConverter的文本框状态绑定到XAML中的按钮
我有一个C# 将失败的IValueConverter的文本框状态绑定到XAML中的按钮,c#,wpf,xaml,ivalueconverter,C#,Wpf,Xaml,Ivalueconverter,我有一个TextBox,它绑定到IPAddress属性。为此,我实现了一个IValueConverter,它试图将TextBox的字符串解析为IPAddress。当转换失败时,文本框周围会自动绘制红色边框,表示给定值不正确。到目前为止,这是可行的,并且与预期的一样 我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到按钮的IsEnabled属性。所有这些都在XAML中 这里是IValueConverter: public class IpAddressConverter : IValu
TextBox
,它绑定到IPAddress
属性。为此,我实现了一个IValueConverter
,它试图将TextBox
的字符串
解析为IPAddress
。当转换失败时,文本框
周围会自动绘制红色边框,表示给定值不正确。到目前为止,这是可行的,并且与预期的一样
我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到按钮的IsEnabled
属性。所有这些都在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;
}
}
编辑:
我已经实现了验证输入的逻辑。但由于转换失败,属性无法更新。这意味着属性仍然保留“旧”值,这当然是正确的,但不需要验证。在这种情况下,在ViewModel中插入从字符串到iPAddress的转换逻辑将允许您从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
,将文本框的Text
绑定到IPAddressText
。您还可以使用DataTrigger将边框样式设置为跟随IsValidIp
,从而节省大量XAML标记
这还允许您执行将来给定文本框文本时可能需要执行的任何其他处理。也许您可以使用并在按钮上放置一个DataTrigger
,只需操作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
。我希望有帮助。
您可以从转换器返回未设置的值
,表示无法转换值并在验证逻辑中使用。这是一篇文章that@PavelAnikhouski不幸的是,它不起作用。属性的backing字段仍然保留以前设置的值。可能它工作正常,但没有达到我想要的结果。这看起来很有趣。我正在搜索的Validation.HasError
属性。是否有理由将其置于括号内?我会试试的。这是否只需要IValueConverter
或INotifyDataErrorInfo
的验证逻辑?@FredM验证。HasError
位于圆括号之间,因为它是一个,所以这是正确的语法。如果按代码设置IP地址值,则需要INotifyDataErrorInfo
。如果你只使用文本框来数字化IP,那就没有必要了。所以你的回答确实帮助我实现了我想要的。我又添加了两个DataTrigger
绑定到两个单独的TextBox
。如果现在只有一个在验证上出错
,则该按钮将被禁用。谢谢找到了仅适用于XAML的解决方案。不过,谢谢你的意见。