我定义了以下转换器(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'上提供值抛出异常。
第一个文本块可以正常显示主题。第二行是我的例外。
答案 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中定义的时候。你可以在其他地方定义它。
如果这不是问题....要找到解析错误的更详细解释...检查内部异常文本。