2014-01-17 3 views
0

У меня есть ListBox, где я отображаю все позиции позиций. Мне нужно показать цену. Я создал ValueConverter, который принимает объект OrderPosition и возвращает мою цену как двойную. формула: Сумма * Product.Price (Amount и Product являются свойства в OrderPosition)Пропустить текущий элемент в ValueConverter

Мой XAML просто ничего не отображается:

<ListBox Grid.Row="1" Grid.Column="0" Margin="3" ItemsSource="{Binding SelectedOrder.OrderPositions}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <TextBlock Grid.Column="0"> 
         <TextBlock.Text> 
          <MultiBinding StringFormat="{}{0}x {1}"> 
           <Binding Path="Amount" /> 
           <Binding Path="Product.Label" /> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
        <TextBlock Text="{Binding /, Converter={StaticResource PositionPriceConverter}, StringFormat={}{0:c}}" Grid.Column="1" 
            TextAlignment="Right" /> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Вот мой конвертер:

public class PositionPriceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var position = (OrderPosition)value; 
     return position.Amount * position.Product.Price; 
    } 

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

Вы можете показать свой конвертер? – sexta13

+0

Я добавил. Я предполагаю, что кастинг работает, потому что мое приложение не генерирует исключение. –

+0

Я думаю, что @dkozl - лучший ответ :) – sexta13

ответ

3

На данный момент вы установили Path=/, который связывает его CollectionView.CurrentItem

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

Вы можете добиться того, что вы после этого, установив Path=. или не устанавливать Path вообще.

<TextBlock Text="{Binding Path=., Converter=...} 

или

<TextBlock Text="{Binding Converter=...} 

, но знайте, что это не будет вызывать обновление, когда либо Amount или Product.Price будет меняться так, может быть MultiBinding и IMultiValueConverter будет лучшим вариантом.

+0

Спасибо, что работает. Я пробовал {Binding Path, Converter ...}, но получил ошибку. Без запятой это работает. –

0
   <ListBox Grid.Row="1" 
        Grid.Column="0" 
        Margin="3" 
        ItemsSource="{Binding SelectedOrder.OrderPositions}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <TextBlock Grid.Column="0"> 
           <TextBlock.Text> 
            <MultiBinding StringFormat="{}{0}x {1}"> 
             <Binding Path="Amount" /> 
             <Binding Path="Product.Label" /> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
          <TextBlock Grid.Column="1"> 
           <TextBlock.Text> 
            <MultiBinding Converter="{StaticResource PositionPriceConverter}" StringFormat="{}{0}x {1}"> 
             <Binding Path="Amount" /> 
             <Binding Path="Product.Label" /> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Измените преобразователь следующим образом:

public class PositionPriceConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var amt = (double)values[0]; 
     var price = (double) values[1]; 
     return amt * price; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
0

Я не уверен, что этот путь, который вы предоставили связыванию, является законным ({Binding /, Converter....).

попытаться изменить его:

<TextBlock Text="{Binding Converter={StaticResource PositionPriceConverter}, StringFormat={}{0:c}}" Grid.Column="1" TextAlignment="Right" /> 

или

<TextBlock Text="{Binding Path=., Converter={StaticResource PositionPriceConverter}, StringFormat={}{0:c}}" Grid.Column="1" TextAlignment="Right" /> 
Смежные вопросы