Подтвердить что ты не робот

Передайте значение поля в Silverlight ConverterParameter

Я пишу свое первое приложение Silverlight. У меня есть datagrid с столбцом, который имеет две метки, для ярлыков, я использую IValueConverter для условного форматирования данных.

Метка "Содержимое" устанавливается следующим образом:

Content="{Binding HomeScore, Converter={StaticResource fmtshs}}"

и

Content="{Binding AwayScore, Converter={StaticResource fmtshs}}"

Метод Преобразовать моего IValueConverter таков:

Public Function Convert(
  ByVal value As Object, 
  ByVal targetType As System.Type, 
  ByVal parameter As Object, 
  ByVal culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert

    Dim score As Long = value, other As Long = parameter

    Return If(score < 0, "", 
        If(score - other > 5, (other + 5).ToString, score.ToString)
    )

End Function

Так что я хочу сделать в конвертере для HomeScore, я хочу передать AwayScore в ConverterParameter, а для AwayScore я хочу передать HomeScore в конвертер. В конвертере для любого балла мне нужно знать значение другого балла для целей форматирования.

Но я не могу понять синтаксис для привязки ConverterParameter к другому полю.
Я пробовал следующее:

Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter=AwayScore}"  
Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter={AwayScore}}"  
Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter={Binding AwayScore}}"  

Но никто из них не работает. Как передать значение поля в ConverterParameter?

4b9b3361

Ответ 1

Как вы не можете передать ничего, кроме буквального в ConverterParameter, решение состоит в том, чтобы передать весь объект в конвертер, а затем вы можете получить доступ ко всем его свойствам из конвертера.

Итак, ваш код становится (если ваш объект называется Match):

Public Function Convert(
  ByVal value As Object, 
  ByVal targetType As System.Type, 
  ByVal parameter As Object, 
  ByVal culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert

    Dim match As Match = value

    ' Do stuff with match'

End Function

(Извинения за отсутствие деталей в коде)

Затем ваш XAML станет

Content="{Binding Converter={StaticResource fmtshs}}"

ПРИМЕЧАНИЕ Пока вы явно привязываетесь непосредственно к конвертеру, это на самом деле не так. Вы привязываетесь к контексту данных, не указав Path, чтобы вы могли использовать доступ ко всему этому.

Источник

Ответ 2

Похоже, вы пытаетесь привязать к ConverterParameter, которого я боюсь, что вы не можете. ConverterParameter может принимать только литералы, например ConverterParameter = 'Your string'

Ответ 3

У меня была такая же проблема, и мне пришлось спать на ней. Кажется, что конвертер получает "один выстрел" при получении данных - через значение привязки.

Итак, сделайте значение Binding сложным классом. В любом случае, если вы используете MV-VM, вы должны формировать данные, поэтому я сделал значение Binding "более усердным", включив отображаемое значение и другие данные, которые мне нужны в моем конвертере (создав класс, если вы это сделаете).

Затем мне нужно было работать с более сложным режимом конвертера, с ограничением прохождения ConverterParameters в качестве литералов типа значения, поэтому я создаю Enum в моем конверторе и накладываю на него литерал для большей элегантности в моей программе Convert.

То, что я мог бы сделать, это разный цвет (кисть) и толщина ячейки сетки, основанный на отображаемом значении и другое пороговое значение (которое я проверяю).

Исходный код находится на моем сайте блога, его код Silverlight 3 с использованием привязки в псевдомодуле M-V-VM (нет инъекции зависимостей, но эй - его пример, правильно?)

скачать по адресу: http://www.martymazurik.com/file.axd?file=2010%2f6%2fHighlightGridCell.zip.txt

затем удалите .txt

Ответ 4

У ChrisF есть единственное решение, к которому я смог подключиться - привязать весь объект данных к свойству контента и использовать конвертер, построенный для того, чтобы этот тип объекта анализировал свойства, которые вам нужны в самом конверторе.

<sdk:DataGridTextColumn Header="Report Name" Binding="{Binding Mode=OneTime, Converter={StaticResource ReportNameDateQuarterConverter}}" />


/// <summary>
/// Gets Exposure Report Name Quarter Number formatted from Report.Date and Report.Name
/// </summary>
public class ReportNameDateQuarterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string qStr = "Quarter ";
        if (value != null && value.GetType() == typeof(Report))
        {
            switch (((Report)value).Date.Month)
            {
                case 1:
                case 2:
                case 3:
                    return qStr + "1 " + ((Report)value).Name;
                case 4: 
                case 5:
                case 6:
                    return qStr + "2 " + ((Report)value).Name;
                case 7:
                case 8:
                case 9:
                    return qStr + "3 " + ((Report)value).Name;
                case 10:
                case 11:
                case 12:
                    return qStr + "4 " + ((Report)value).Name;
                default:
                    return qStr + "? " + ((Report)value).Name;

            }
        }
        return qStr + "? " + ((Report)value).Name;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Ответ 6

Если вы хотите связать параметр преобразователя, посмотрите на это: http://brandontruong.blogspot.com/2009/06/binding-for-converter-parameter.html Это может быть не самое чистое решение, но оно простой и может быть полезен в некоторых ситуациях