Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将失败的IValueConverter的文本框状态绑定到XAML中的按钮_C#_Wpf_Xaml_Ivalueconverter - Fatal编程技术网

C# 将失败的IValueConverter的文本框状态绑定到XAML中的按钮

C# 将失败的IValueConverter的文本框状态绑定到XAML中的按钮,c#,wpf,xaml,ivalueconverter,C#,Wpf,Xaml,Ivalueconverter,我有一个TextBox,它绑定到IPAddress属性。为此,我实现了一个IValueConverter,它试图将TextBox的字符串解析为IPAddress。当转换失败时,文本框周围会自动绘制红色边框,表示给定值不正确。到目前为止,这是可行的,并且与预期的一样 我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到按钮的IsEnabled属性。所有这些都在XAML中 这里是IValueConverter: public class IpAddressConverter : IValu

我有一个
TextBox
,它绑定到
IPAddress
属性。为此,我实现了一个
IValueConverter
,它试图将
TextBox
字符串
解析为
IPAddress
。当转换失败时,
文本框
周围会自动绘制红色边框,表示给定值不正确。到目前为止,这是可行的,并且与预期的一样

我的问题是,是否有办法以某种方式获得转换的失败状态,将其绑定到
按钮的
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;
    }
}
编辑:
我已经实现了验证输入的逻辑。但由于转换失败,属性无法更新。这意味着属性仍然保留“旧”值,这当然是正确的,但不需要验证。

在这种情况下,在ViewModel中插入从字符串到iPAddress的转换逻辑将允许您从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
。您还可以使用DataTrigger将边框样式设置为跟随
IsValidIp
,从而节省大量XAML标记

这还允许您执行将来给定文本框文本时可能需要执行的任何其他处理。

也许您可以使用并在
按钮上放置一个
DataTrigger
,只需操作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
。我希望有帮助。

您可以从转换器返回
未设置的值
,表示无法转换值并在验证逻辑中使用。这是一篇文章that@PavelAnikhouski不幸的是,它不起作用。属性的backing字段仍然保留以前设置的值。可能它工作正常,但没有达到我想要的结果。这看起来很有趣。我正在搜索的
Validation.HasError
属性。是否有理由将其置于括号内?我会试试的。这是否只需要
IValueConverter
INotifyDataErrorInfo
的验证逻辑?@FredM
验证。HasError
位于圆括号之间,因为它是一个,所以这是正确的语法。如果按代码设置IP地址值,则需要
INotifyDataErrorInfo
。如果你只使用文本框来数字化IP,那就没有必要了。所以你的回答确实帮助我实现了我想要的。我又添加了两个
DataTrigger
绑定到两个单独的
TextBox
。如果现在只有一个在
验证上出错
,则该按钮将被禁用。谢谢找到了仅适用于XAML的解决方案。不过,谢谢你的意见。