У меня есть четыре текстовых поля, которые представляют части одной строки, и я хотел бы иметь конвертер для реализации двухстороннего связывания с параметром для идентификации части строки.
Я работаю над управлением 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-адреса.
Возможно ли иметь разные привязки для каждого направления? Или есть лучшее решение моей проблемы?