2016-06-05 5 views
0

У меня есть объект ниже:Xamarin Forms ConverterParameter - как ссылаться на текущее свойство объекта?

public class MyObj { 
    public string Name {get; set;} 
    public double Weight {get; set;} 
} 

Я создаю ObservableCollection объектов из этого класса и присвоить его ItemsResource из ListView (через lvMyObjs ниже). У меня также есть запись.

мне нужно сделать следующее для каждой строки в моей ListView

  • Получить значение из записи и передать его в конвертере
  • Умножить значение входа со свойством Вес текущего элемента в преобразователь
  • Показать значение в соответствующей строке в моем списке.

В XAML у меня есть это:

<Entry x:Name="entSourceValue"/> 
<ContentPage.Resources> 
    <ResourceDictionary> 
    <local:SourceToTargetConverter x:Key="myConverter" /> 
    </ResourceDictionary> 
</ContentPage.Resources> 

<ListView x:Name="lvMyObjs"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <ViewCell> 
      <ContentView> 
      <Frame> 
       <StackLayout Orientation="Horizontal"> 
       <Label Text="{Binding Name}" /> 
       <Label x:Name="lblResult" 
        Text="{ 
          Binding Text,        
          Converter={StaticResource myConverter}, 
          ConverterParameter={}, 
          Source={x:Reference entSourceValue} 
          }"/> 
       </StackLayout> 
      </Frame> 
      </ContentView> 
     </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

В моем преобразователе я это:

public class SourceToTargetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    {      
     double sourceDouble; 
     double.TryParse((string)value, out sourceDouble); 
     //todo: convert parameter to double 
     //double weight = 

     return sourceDouble * weight; 

    } 
} 

я могу получить значение моего входа в конвертере, без каких-либо проблем. Мой вопрос: как я могу отправить «Вес» текущего элемента в списке в качестве параметра в конвертер? Другими словами, что я должен положить в строку «ConverterParameter = {},"?

Любая помощь очень ценится.

ответ

1

Вы можете передать MyObj в преобразователь, а затем использовать x:Reference для вашего Entry в качестве параметра.

<Label x:Name="lblResult" Text="{Binding Path=. ,        
         Converter={StaticResource myConverter}, 
         ConverterParameter={x:Reference entSourceValue} 
         }"/> 

А потом

public class SourceToTargetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    {      
     return ((MyObj)value).Weight * (double)((Entry)parameter).Text; 
    } 
} 

Я не проверял это. Добавьте свои собственные проверки типов, но это, надеюсь, поможет вам.

+0

Когда я отлаживаю ваш код, я получаю удар по методу конвертера при запуске приложения в симуляторе. Но ничего не происходит, когда я вводю что-то в Entry, и я даже не прихожу к методу Converter. – LonelyDeveloper

+1

@LonelyDeveloper Вам нужно будет поднять событие с измененным свойством для объекта списка, чтобы конвертер снова запустился. – AllDayer

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