我有一个绑定到TextBox
属性的IPAddress
。为此,我实现了一个IValueConverter
,它试图将string
的{{1}}解析为TextBox
。转换失败时,IPAddress
周围将自动绘制一个红色边框,指示给定的值不正确。到目前为止,它已经可以正常运行并且像预期的那样。
我的问题是,是否有办法以某种方式将转换的失败状态绑定到TextBox
的{{1}}属性。还有XAML中的所有内容。
IsEnabled
:
Button
编辑: 我已经实现了验证输入的逻辑。但是由于转换失败,该属性不会得到更新。这意味着该属性仍然保留“旧”值,这当然是正确的,但不需要进行验证。
答案 0 :(得分:1)
也许您可以使用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
。希望对您有所帮助。
答案 1 :(得分:0)
在这种情况下,在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
并将文本框的Text
绑定到IPAddressText
。您还可以将边框样式设置为紧跟IsValidIp
之后再加上DataTrigger,从而节省了很多XAML标记。
这也使您可以执行将来可能需要执行的其他处理。