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

问题描述 投票:0回答:2

我有一个TextBox绑定到IPAddress财产。为此,我实施了一个IValueConverter,试图将stringTextBox解析为IPAddress。转换失败时,会在TextBox周围自动绘制红色边框,表示给定值不正确。到目前为止,这是有效的。

我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到IsEnabledButton属性。以及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;
    }
}

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

c# wpf xaml ivalueconverter
2个回答
1
投票

也许你可以使用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。我希望它有所帮助。


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,将TextBox的Text绑定到IPAddressText。您还可以使用DataTrigger设置边框样式以跟随IsValidIp,从而为您节省大量XAML标记。

这也允许您在将来给出TextBox文本时执行您可能需要执行的任何其他处理。

© www.soinside.com 2019 - 2024. All rights reserved.