Как связать 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)

Другие вопросы по тегам