我有一个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进行数据绑定。
答案 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。