Не удается заставить работать простой конвертер при использовании связанной строки - PullRequest
1 голос
/ 07 февраля 2012

У меня определен следующий конвертер (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-я строка дает мне исключение.

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Каков порядок ваших объектов в вашем XAML?

Converter должен быть определен до фактического использования, поэтому убедитесь, что ваш <Converter> выше вашего <DataTemplate> в вашем Resources

Другой альтернативой является переключение на использование DynamicResource вместо StaticResource, поскольку DynamicResource оценивается, когда это необходимо, а не при загрузке XAML

1 голос
/ 07 февраля 2012

Эта ошибка обычно возникает, когда не удается найти статический ресурс, который вы ищете.Вы должны будете определить это в своих статических ресурсах.

<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.Вы можете определить это в другом месте.

Если проблема не в этом ..., чтобы найти более подробное объяснение ошибки синтаксического анализа ... проверьте текст внутреннего исключения.

...