2009-08-28 8 views
12

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

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

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?

+0

я попробовал одно- кавычки, но в конвертере он дает мне строку «{Binding SomeOtherProperty}». Я что-то пропустил? :(PS. Я использую Silverlight 3. –

+0

Посмотрите на Multibind преобразователи http://stackoverflow.com/questions/377841/what-should-the-converter-parameter-be-for-this-binding – Rauld

ответ

6

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

+0

Да , это было именно то, что я пытался сделать. – eidylon

+3

, если вы еще этого не поняли, одинарные кавычки - это то, что вам не хватает в вашем вопросительном коде. – Aligned

2

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

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

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

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

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

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

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

+0

Я думаю, что это лучший подход до сих пор. делегирует ответственность за сложность в объект, где он принадлежит +1 –

7

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

Source

+6

Проблема в том, что если свойство на объекте обновляется, то valueconverter не срабатывает – Calanus

+0

Просто для ясности: @ChrisF, вы не привязываетесь к конвертер, как вы упомянули в своем ПРИМЕЧАНИЕ. Вы привязываетесь к текущему datacontext (например, Path =.), используя данный преобразователь. Связывание с конвертером - это вздор. –

+0

@ Dercsár - действительно. Это была короткая стенография, которая в ретроспективе сбивает с толку. – ChrisF

2

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

<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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^