我有一个
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.