在绑定的String上使用时无法使简单的转换器工作

时间:2012-02-07 14:01:40

标签: c# wpf string binding converter

我定义了以下转换器(C#):

class BodyValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string s = value.ToString();
        int prefixLength;
        if (!int.TryParse(parameter.ToString(), out prefixLength))
            return s;
        return s.Substring(0, prefixLength);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

这将从传递的字符串的开头开始,并将返回我指定的字符数作为参数。

在我的XAML中我实例化了转换器:

<local:BodyValueConverter x:Key="BodyValueConverter"/>

尝试在文本块中使用此转换器时出现错误:

<DataTemplate x:Key="AppointmentTemplate">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Subject}"></TextBlock>
        <TextBlock Text="{Binding Path=Subject, Converter={StaticResource BodyValueConverter}, ConverterParameter=1}"></TextBlock>
    </StackPanel>
</DataTemplate>

错误是:

  

XAMLParseException:在'System.Windows.Markup.StaticResourceHolder'上提供值抛出异常。

第一个文本块可以正常显示主题。第二行是我的例外。

2 个答案:

答案 0 :(得分:4)

XAML中对象的顺序是什么?

Converter必须在实际使用之前定义,因此请确保<Converter>高于<DataTemplate> <{p>}中的Resources

另一种方法是切换到使用DynamicResource而不是StaticResource,因为DynamicResource会在需要时进行评估,而不是在加载XAML时进行评估

答案 1 :(得分:1)

当找不到您要查找的静态资源时,通常会抛出该错误。您需要在静态资源中定义它。

<Window 
  .... snip ...
  xmlns:local="clr-namespace:YourLocalNamespace"
  <Window.Resources>
    <local:BodyValueConverter x:Key="BodyValueConverter"/>
  </Window.Resources>
  .... snip ....
  <DataTemplate x:Key="AppointmentTemplate">
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Subject}"></TextBlock>
      <TextBlock Text="{Binding Path=Subject, Converter={StaticResource BodyValueConverter}, ConverterParameter=1}"></TextBlock>
    </StackPanel>
  </DataTemplate>
</Window>

注意:这是在Window中定义的时候。你可以在其他地方定义它。

如果这不是问题....要找到解析错误的更详细解释...检查内部异常文本。