Передать значение поля в Silverlight ConverterParameter - PullRequest
12 голосов
/ 28 августа 2009

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

«Содержимое» ярлыка установлено так:

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

и

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

Метод Convert моего 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?

Ответы [ 6 ]

7 голосов
/ 08 декабря 2010

Поскольку вы не можете передать ничего, кроме литерала, в 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, чтобы вы могли использовать доступ ко всему этому.

Источник

6 голосов
/ 28 августа 2009

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

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

У 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();
    }
}
2 голосов
/ 12 июня 2010

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

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

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

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

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

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

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

0 голосов
/ 26 сентября 2011

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

0 голосов
/ 28 августа 2009

Не совсем уверен, что понимаю вашу проблему, но думаю, что вы ищете привязку с "elementname"?

например: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/03/27/silverlight-3-s-new-element-data-binding.aspx

...