Связывание с конвертером внутри шаблона - PullRequest
0 голосов
/ 03 августа 2011

Я определил DataTemplate для ListBox. Внутри шаблона я использую элементы управления TextBlock для отображения свойств контекста данных. Например:

<TextBlock Text="{Binding Path=FirstName}" />

И если я сделаю это:

<TextBlock Visibility="{Binding Path=IsAccountValid}" />

... приложение запускается, но в выводе появляется предупреждение о попытке связать логическое свойство с перечислением Visibility.

Если я сделаю это:

<TextBlock Visibility="{Binding Path=IsAccountValid,Converter={StaticResource visibilityOfBool}}" />

и где-то в моем App.xaml есть:

<BooleanToVisibilityConverter x:Key="visibilityOfBool" />

Я получаю исключение нулевой ссылки.

Я подозревал, что это может быть связано с тем, что свойство IsAccountValid не является свойством зависимости, поэтому я добавил CheckBox в окно и сделал следующее:

<TextBlock Visibility="{Binding Path=IsChecked,Converter={StaticResource visibilityOfBool},ElementName=butA}" />

Но получил ту же ошибку.

Почему? Объект DataContext действителен, потому что, если я связываю IsAccountValid со свойством Text, значение отображается правильно.

Конвертер никогда не вызывается, поэтому мне интересно, если это конвертер, который не может быть найден.

Почему конвертер не может быть найден? Почему конвертер можно найти вне шаблона данных, а не внутри шаблона данных?

Я попытался построить шаблон снова с помощью Blend, поскольку Blend обычно делает это правильно, но сгенерированный код был таким же, как мой.

Я попробовал некоторые исправления, предложенные на этом веб-сайте, включая установку RelativeSource на TemplateParent и Self, но это не имело значения.

Что происходит?

Ответы [ 4 ]

1 голос
/ 03 августа 2011

Мы постоянно используем такой конвертер в наших шаблонах данных. Вы определяете ключ конвертера в своем словаре ресурсов? Объединить другой словарь ресурсов?

0 голосов
/ 04 августа 2011

Спасибо всем за помощь в моем расследовании.

Я решил проблему.

Эти две строки кода включены в DataTemplate, одна - это TextBlock, а другая -гиперссылка:

<TextBlock Text="Hello" Visibility="{Binding IsChecked,ElementName=chkBox,Converter={StaticResource visibilityOfBool}}" />

и

<TextBlock Grid.Column="1" >
    <Hyperlink Click="ProgHomePageHyperlink_Click" >
         <TextBlock Text="{Binding Path=Title}" />
    </Hyperlink>
</TextBlock>

Когда они оба включены в код, среда выполнения выдает исключение нулевой ссылки.

Но если я прокомментирую одноиз них, TextBlock или HyperLink, все работает нормально.

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

Если я закомментирую конвертер в TextBlockприложение запускается, но я получаю предупреждение о несоответствии привязки, которое вполне заслужено.

Итак, включение обработчика Click в гиперссылку означает, что преобразователь в TextBlock не может быть найден.

Какстранно это!

0 голосов
/ 04 августа 2011

Как указали Амиттай и Крис, кажется, что вы движетесь в правильном направлении.Я знаю, это звучит немного глупо, но попробуйте добавить пробел между запятой и оператором Converter= в привязке.Вот так:

<TextBlock Visibility="{Binding Path=IsAccountValid, Converter={StaticResource visibilityOfBool}}" />

В некоторых системах появляются странные симптомы, когда после запятой нет пробела.Я не мог найти фактическую причину для этого.

0 голосов
/ 03 августа 2011

Свойство IsAccountValid не обязательно должно быть свойством зависимости.Если конвертер не найден, вы не сможете открыть форму.У вас есть правильный подход с использованием конвертера, но трудно точно сказать, что является причиной исключения, не видя больше информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...