Передайте значение поля в 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?
Ответы
Ответ 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();
}
}
Ответ 5
Не совсем уверен, что я понимаю вашу проблему, но я думаю, что вы ищете привязку к "elementname"?
ex: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/03/27/silverlight-3-s-new-element-data-binding.aspx
Ответ 6
Если вы хотите связать параметр преобразователя, посмотрите на это: http://brandontruong.blogspot.com/2009/06/binding-for-converter-parameter.html Это может быть не самое чистое решение, но оно простой и может быть полезен в некоторых ситуациях