c# – Windows Phone中的多值转换器

我有一个
Windows Phone应用程序.

让我们说我有一个CustomersViewModel类来公开客户列表.我在xaml中有一个绑定到该列表的列表:

<ListBox ItemsSource="{Binding Path=Data}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Text="{Binding Converter={StaticResource userIdToNameConverter}" />                    
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

因此,列表框中的每个项目都将绑定到单个客户对象.

CustomersViewModel还有一个属性

string StoreId

在我上面的XAML中,我想将StoreId传递给转换器,以及我已经传递的客户对象.怎么能优雅地做到这一点?

似乎IM8上不存在IMultiValueConverter,并且不可能对转换器的ConverterParameter进行数据绑定.

最佳答案 这个
blog post解释了解决问题的方法.我们的想法是在你的转换器上创建一个
dependency property.然后,您可以将StoreId绑定到此,而不是使用ConverterParameter.

因此,在UserIdToNameConverter上,您需要从DependencyObject继承,并添加依赖项属性:

public class UserIdToNameConverter : DependencyObject, IValueConverter
{
    public string StoreId
    {
        get { return (string) GetValue(StoreIdProperty); }
        set { SetValue(StoreIdProperty, value); }
    }

    public static readonly DependencyProperty StoreIdProperty =
        DependencyProperty.Register("StoreId",
                                    typeof (string),
                                    typeof (UserIdToNameConverter),
                                    new PropertyMetadata(string.Empty));

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        //Your current code
        //Can now use StoreId instead of ConverterParameter
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        //Same as above;
    }
}

然后,您可以在视图的资源中绑定到此依赖项属性:

<UserControl.Resources>
    <UserIdToNameConverter x:Key="UserIdToNameConverter" StoreId="{Binding StoreId}"/>
</UserControl.Resources>

这假设您的视图的DataContext设置为CustomersViewModel,它可以在其中找到StoreId属性.然后,您可以使用与问题相同的方式使用转换器.

作为旁注,如果您在ItemTemplate中而不是在Resources内部创建转换器,它将无法工作.有关更多信息,请参阅博客文章.所有功劳归功于博客作者Sebastien Pertus.

点赞