использование IValueConverter с текущим DataContext в двусторонней привязке - PullRequest
6 голосов
/ 10 декабря 2010

У меня проблемы с конвертером, который я использую для преобразования между строкой и нашим форматом времени.Сам конвертер работает нормально и реализован так:

    [ValueConversion(typeof(string), typeof(SimpleTime))]
    public class StringToSimpleTimeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert from string to SimpleTime and return it
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert value from SimpleTime to string and return it
        }
    }

XAML, использующий конвертер, включает сам конвертер в usercontrol.resources, например:

<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/>

Если свойствовстречается (я использую сетку данных из набора инструментов wpf в фоновом режиме) используется таблица данных для редактирования simpletime:

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>

Проблема, с которой я сталкиваюсь, заключается в том, что конвертер должен иметь путьуказано в привязке, если это двухсторонний преобразователь (и мне нужно его в обоих направлениях), но свойство, которое я хочу установить, уже является текущим DataContext - Какой путь я могу указать для этого тогда?

Обходной путь, о котором я мог бы подумать, - это ввести в SimpleTime фиктивное свойство, которое просто получает текущий SimpleTime или устанавливает его.

public class SimpleTime
{
    ...
    public SimpleTime Clone
    {
        get { return new SimpleTime(_amount, _format); }
        set { this._amount = value._amount; this._format = value._format; }
    }
}

и связывается с ним через

 <TextBox Text="{Binding Clone, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>

, которое работает нормальноно это не совсем подходящее решение, особенно если мне нужно больше конвертеров ...

любая помощь приветствуется, ура, чувакп

Ответы [ 3 ]

5 голосов
/ 10 декабря 2010

Я думаю, вы можете обойти это так

<TextBox Text="{Binding Path=DataContext,
                        RelativeSource={RelativeSource Self},
                        Converter={StaticResource stringToSimpleTimeConverter}, 
                        Mode=TwoWay}"/>
0 голосов
/ 27 апреля 2018

Я знаю, что это старый вопрос, но если кто-то наткнется на это, правильный Путь здесь будет Path=.

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding Path=., Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>
0 голосов
/ 10 декабря 2010

Вместо того, чтобы вводить фиктивное свойство в ваш класс, почему бы не создать контейнерный класс, подобный следующему:

public class Container
{
    public Object DataItem { get; set; }

    //...
}

и используйте его как:

<TextBox Text="{Binding DataItem, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>

Это не повредит / не изменит ваш существующий класс и все же позволит вам делать то, что вы хотите сделать.

...