我正在使用Silverlight中的IValueConverter。此值转换器需要循环遍历MyOption元素的集合并获得匹配。 MyOption值实际上来自数据库。我在DataGrid中使用这个转换器。因此,我不想每次都访问数据库。相反,我想打一次数据库,并将选项传递给转换器。为了实现这一点,我想我会公开一个属性并将我的MyOption元素集合绑定到它,如下所示:
<converters:MyTypeConverter x:Key="myTypeConverter" UpdateTypes="{Binding Path=MyOptions}" />
...
<TextBlock Text="{Binding Path=OptionID, Converter={StaticResource myTypeConverter}}" />
然后我定义了MyTypeConverter,如下所示:
public class MyTypeConverter : UIElement, IValueConverter
{
public ObservableCollection<MyOption> Options
{
get { return (ObservableCollection<MyOption>)GetValue(OptionsProperty); }
set { SetValue(OptionsProperty, value); }
}
public static readonly DependencyProperty OptionsProperty =
DependencyProperty.Register("Options",
typeof(string), typeof(MyTypeConverter), null);
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string result = SomeObject.Convert(value, Options);
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
不幸的是,我似乎无法让这个工作。这几乎就像我无法绑定到转换器。我得到一个编译时错误,上面写着:“System.Windows.UIElement类型没有定义构造函数。”同时,我不知道如何将MyOptions传递给类型转换器,这样我就不会多次往返服务器。
答案 0 :(得分:0)
这是转换器参数的来源。您需要将选项与OptionID一起发送:
<converters:MyTypeConverter x:Key="myTypeConverter" />
...
<TextBlock Text="{Binding Path=OptionID,
Converter={StaticResource myTypeConverter},
ConverterParameter={Binding Path=MyOptions}}" />
的TypeConverter:
public class MyTypeConverter : UIElement, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var Options = parameter As ObservableCollection<MyOption>
string result = SomeObject.Convert(value, Options);
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
你需要检查参数是否为空,并且在你传递参数后它包含了一些内容,但你明白了......