将当前项传递给ValueConverter

时间:2014-01-17 11:03:04

标签: c# wpf

我有ListBox我显示所有订单位置。我需要显示价格。我创建了一个ValueConverter,它接受​​一个OrderPosition对象并将我的价格返回为double。 公式:金额* Product.Price(AmountProductOrderPosition)中的属性

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

3 个答案:

答案 0 :(得分:3)

目前您设置了Path=/,并将其绑定到CollectionView.CurrentItem

  

当源是集合视图时,可以使用斜杠(/)指定当前项。例如,子句Path = /设置绑定到视图中的当前项。当源是集合时,此语法指定默认集合视图的当前项。

您可以通过设置Path=.或完全设置Path来实现您所追求的目标。

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

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

但请注意,当AmountProduct.Price发生变化时,它不会触发更新,因此MultiBindingIMultiValueConverter可能是更好的选择。

答案 1 :(得分: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();
    }
}

答案 2 :(得分: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" />