将失败的IValueConverter的TextBox状态绑定到XAML中的按钮

时间:2019-04-10 09:55:23

标签: c# wpf xaml ivalueconverter

我有一个绑定到TextBox属性的IPAddress。为此,我实现了一个IValueConverter,它试图将string的{​​{1}}解析为TextBox。转换失败时,IPAddress周围将自动绘制一个红色边框,指示给定的值不正确。到目前为止,它已经可以正常运行并且像预期的那样。

我的问题是,是否有办法以某种方式将转换的失败状态绑定到TextBox的{​​{1}}属性。还有XAML中的所有内容。

IsEnabled

Button

编辑: 我已经实现了验证输入的逻辑。但是由于转换失败,该属性不会得到更新。这意味着该属性仍然保留“旧”值,这当然是正确的,但不需要进行验证。

2 个答案:

答案 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标记。

这也使您可以执行将来可能需要执行的其他处理。