Windows手机中的多值转换器

时间:2013-11-26 22:21:18

标签: c# xaml data-binding windows-phone-8

我有一个Windows手机应用程序。

让我们说我有一个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传递给转换器,以及我已经传递的客户对象。怎么能优雅地做到这一点?

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

1 个答案:

答案 0 :(得分:2)

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。