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

Bind TextBox state of failed IValueConverter to a Button in XAML

我有一个 TextBox 绑定到 IPAddress 属性。为此,我实现了一个 IValueConverter,它试图将 TextBoxstring 解析为 IPAddress。当转换失败时,TextBox 周围会自动画上红色边框,表示给定的值不正确。到目前为止一切正常,符合预期。

我的问题是,是否有办法以某种方式获得这种失败的转换状态,将其绑定到 ButtonIsEnabled 属性。 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 PropertiesDataTrigger 放在你的 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。我希望它有所帮助。