Как связать 2 элемента управления с 1 полем И также получить доступ к 2 значениям элемента управления для ConvertBack?
В DataGridTemplateColumn DataTemplate я хочу привязать 2 элемента управления к строковому полю формата "[name]:[value]", то есть строка разделяется двоеточием ":". Мне нужно привязать элемент управления а) к части [имя] и элемент управления б) часть значения.
Я был в состоянии успешно использовать IValueConverter, чтобы разделить строку для отображения:
public class NameAndValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string rtn = "";
string[] split = value.ToString().Split(':');
if (split.Count() == 2)
{
if(parameter.ToString() == "Name")
rtn = split[0];
if(parameter.ToString() == "Value")
rtn = split[1];
}
return rtn;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException("NameAndValueConverter can only be used OneWay.");
}
}
И XAML:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<local:NameAndValueConverter x:Key="NameAndValueConverter" />
</StackPanel.Resources>
<TextBox x:Name="namePart" Text="{Binding Path=FieldType, Converter={StaticResource NameAndValueConverter}, ConverterParameter='Name'}" />
<TextBox x:Name="valuePart" Text="{Binding Path=FieldType, Converter={StaticResource NameAndValueConverter}, ConverterParameter='Value'}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
Но данные можно редактировать в текстовых полях, так как я могу получить доступ к 2 значениям TextBox в ConvertBack, чтобы их можно было снова объединить?
1 ответ
Делаем это в XAML:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<local:NameAndValueConverter x:Key="NameAndValueConverter" />
</StackPanel.Resources>
<TextBox x:Name="namePart" Text="{Binding Path=FieldType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource NameAndValueConverter}, ConverterParameter='Name'}" />
<TextBox x:Name="valuePart" Text="{Binding Path=FieldType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource NameAndValueConverter}, ConverterParameter='Value'}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
должно быть достаточно. Тебе необходимо TwoWay
привязка для редактирования из пользовательского интерфейса, и когда вы установите UpdateSourceTrigger
в PropertyChanged
TextBox
обновится автоматически, когда свойство будет изменено во ViewModel (вам, очевидно, потребуется реализовать INotifyPropertyChanged
)