将失败的 IValueConverter 的 TextBox 状态绑定到 XAML 中的 Button
Bind TextBox state of failed IValueConverter to a Button in XAML
我有一个 TextBox
绑定到 IPAddress
属性。为此,我实现了一个 IValueConverter
,它试图将 TextBox
的 string
解析为 IPAddress
。当转换失败时,TextBox
周围会自动画上红色边框,表示给定的值不正确。到目前为止一切正常,符合预期。
我的问题是,是否有办法以某种方式获得这种失败的转换状态,将其绑定到 Button
的 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;
}
}
编辑:
我已经实现了验证输入的逻辑。但是由于转换失败,属性 没有得到更新。这意味着 属性 仍然保留 "old" 值,这当然是正确的,但不需要验证。
在这种情况下,在您的 ViewModel 中插入从字符串到 IPAdress 的转换逻辑将允许您从 XAML 中删除转换标记,同时为您提供 success/failure 转换状态。
例如:
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 标记。
这还允许您执行将来可能需要给定 TextBox 文本的任何其他处理。
也许你可以使用 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
。我希望它有所帮助。
我有一个 TextBox
绑定到 IPAddress
属性。为此,我实现了一个 IValueConverter
,它试图将 TextBox
的 string
解析为 IPAddress
。当转换失败时,TextBox
周围会自动画上红色边框,表示给定的值不正确。到目前为止一切正常,符合预期。
我的问题是,是否有办法以某种方式获得这种失败的转换状态,将其绑定到 Button
的 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;
}
}
编辑: 我已经实现了验证输入的逻辑。但是由于转换失败,属性 没有得到更新。这意味着 属性 仍然保留 "old" 值,这当然是正确的,但不需要验证。
在这种情况下,在您的 ViewModel 中插入从字符串到 IPAdress 的转换逻辑将允许您从 XAML 中删除转换标记,同时为您提供 success/failure 转换状态。
例如:
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 标记。
这还允许您执行将来可能需要给定 TextBox 文本的任何其他处理。
也许你可以使用 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
。我希望它有所帮助。