Привязать состояние TextBox с ошибкой IValueConverter к кнопке в XAML - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть TextBox, который связан со свойством IPAddress. Для этого я реализовал IValueConverter, который пытается проанализировать string из TextBox в IPAddress. Когда преобразование завершается неудачно, красная рамка автоматически закрашивается вокруг TextBox, указывая, что данное значение неверно. Это работает до сих пор и как задумано.

Мой вопрос: есть ли способ каким-то образом получить это неудачное состояние преобразования, чтобы связать его со свойством IsEnabled Button. И все это в 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;
    }
}

EDIT: Я реализовал логику для проверки ввода уже. Но из-за неудачного преобразования свойство не обновляется. А это значит, что свойство все еще содержит «старое» значение, которое, конечно, правильно, но не нуждается в проверке.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Может быть, вы можете использовать Прикрепленные свойства проверки и 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. Я надеюсь, что это помогает.

0 голосов
/ 10 апреля 2019

В подобных случаях вставка логики преобразования из строки в IPAdress в вашей ViewModel позволит вам удалить разметку преобразования из вашего 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 вашей кнопки TextBox с IPAddressText.Вы также можете установить стиль рамки для следования IsValidIp с помощью DataTrigger, что сэкономит вам много разметки XAML.

Это также позволяет вам выполнять любую другую обработку, которая вам может потребоваться, учитывая текст TextBox вбудущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...