WPF двусторонняя привязка данных с параметрами, но с разной функциональностью для каждого направления - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть четыре текстовых поля, которые представляют части одной строки, и я хотел бы иметь конвертер для реализации двухстороннего связывания с параметром для идентификации части строки.

Я работаю над управлением IP-адресами, которое состоит из 4 текстовых полей, представляющих 4 части в IP-адресе. Для каждого текстового поля я привязываю отдельные свойства, а затем выполняю перевод в одну строку IP-адреса с использованием кода позади.

т.е. когда пользователь вводит значение в часть, которая вставляется в строку IP-адреса, и когда IP-адрес изменяется, уведомление свойства заставляет все 4 части извлекать свои значения из строки IP-адреса.

Я бы хотел избежать дублирования кода и иметь привязку с параметром для идентификации части IP-адреса, и могу частично сделать это с помощью конвертера. то есть, когда происходит уведомление свойства текстового поля, этот параметр используется для извлечения правильной части из IP-адреса.

В настоящее время у меня есть следующее

        <TextBox Name="ippart1"
                 Text="{Binding Text1}">
        <TextBox Name="ippart2"
                 Text="{Binding Text2}">
        <TextBox Name="ippart3"
                 Text="{Binding Text3}">
        <TextBox Name="ippart3"
                 Text="{Binding Text4}">

И хотел бы иметь что-то вроде

        <TextBox Name="ippart1"
                 Text="{Binding IpAddress
                 Converter={StaticResource IpAddressPartConverter},
                 ConverterParameter=0}}">
        <TextBox Name="ippart2"
                 Text="{Binding IpAddress
                 Converter={StaticResource IpAddressPartConverter},
                 ConverterParameter=1}}">
        <TextBox Name="ippart3"
                 Text="{Binding IpAddress
                 Converter={StaticResource IpAddressPartConverter},
                 ConverterParameter=2}}">
        <TextBox Name="ippart4"
                 Text="{Binding IpAddress
                 Converter={StaticResource IpAddressPartConverter},
                 ConverterParameter=3}}">

Я мог бы добавить конвертер для извлечения детали из IpAddress (упрощенный код показан ниже).

public class IpAddressPartConverter : IValueConverter
{
    const int cIpComponents = 4;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string retStr = "";
        int ipPartId = 0;
        string ipAddr = value as string;
        string[] strArray = ipAddr.Split('.');

        Int32.TryParse(parameter.ToString(), out ipPartId)

        return strArray[ipPartId];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Wont work because we dont have the rest of the current ip address string. 
    }
}

Проблема, с которой я столкнулся, заключается в том, что преобразователь не работает в обратном направлении из-за отсутствия информации, т.е. когда пользователь меняет значение детали, даже если идентификатор детали и новая строка детали известны, остальные три части нет, и поэтому невозможно создать новую строку IP-адреса.

Возможно ли иметь разные привязки для каждого направления? Или есть лучшее решение моей проблемы?

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