绑定到Silverlight中的IValueConverter

时间:2012-03-21 16:37:52

标签: silverlight xaml

我正在使用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传递给类型转换器,这样我就不会多次往返服务器。

1 个答案:

答案 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;
  }
}

你需要检查参数是否为空,并且在你传递参数后它包含了一些内容,但你明白了......