Преобразователь значений без привязки к источнику изображения - преобразование - PullRequest
0 голосов
/ 22 января 2011

Я связываю свойство строки из класса модели представления с источником изображения в представлении.Свойство String может иметь значение 1 для мужчины и 2 для женщины.Я также использую конвертер для привязки, который возвращает URI для источника изображения.

В моем представлении у меня есть это:

    <Image Style="{StaticResource InfoIcon}" 
           Source="{Binding ., Mode=OneWay,UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource sexImgConverter}, 
                ConverterParameter=Oponent.Info.Sex}"/>

Метод конвертации здесь:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        const string woman = "/images/icons/chat/woman.png";
        const string man = "/images/icons/chat/man.png";

        string result = string.Empty;

        string result = int.Parse(value.ToString()) == 1 ? man : woman;

        return new Uri(result);
    }

Проблема вЯ связываю свойство sex (в представлении Oponent.Info.Sex), которое представляет собой строку типа и разбирает на целое число.

Но если я добавлю точку останова отладчика на строку:

string resul = int.Parse(value.ToString()) == 1 ? man : woman;

Я вижу, что значение является типом моего класса модели представления.

Я пытаюсь использовать этот метод преобразования без другой привязки, вот оно:

<TextBlock Style="{StaticResource InfoText}">
     <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}, {1} rokov">
            <Binding Path="Oponent.Info.Sex" Converter="{StaticResource sexConverter}"/>
            <Binding Path= "Oponent.Info.Age"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Я использую тот же конвектор addточка останова отладчика в строке:

string resul = int.Parse(value.ToString()) == 1 ? man : woman;

Я вижу значение типа строки.

Что я сделал не так?

1 Ответ

2 голосов
/ 22 января 2011

Похоже, вы путаете, как различные части Binding связаны с параметрами метода Convert. Вот подпись метода для IValueConverter.Convert:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

Параметр value исходит из значения привязки, которое обычно присваивается непосредственно целевому свойству. В вашем случае Binding использует {Binding .} (эквивалентно просто {Binding}), который использует текущий DataContext в качестве источника и не указывает путь, поэтому в качестве значения используется объект DataContext (в данном случае ваш класс View Model).

Параметр ConverterParameter, установленный в привязке, отображается как параметр parameter в методе Convert. Это не связанное значение, и оно должно быть фиксированного значения определенного типа: строка, x: ссылка на статический объект, StaticResource и т. Д. При объявлении привязки оно, скорее всего, анализируется как строка: Info.Sex ", который вы должны увидеть в точке останова как parameter в методе Convert.

Binding, который вы используете в MultiBinding, использует параметры в правильных местах. Попробуйте это вместо этого для привязки вашего источника (ваши настройки Mode и UpdateSourceTrigger не нужны):

Source="{Binding Path=Oponent.Info.Sex, Converter={StaticResource sexImgConverter}}"
...