2015-09-29 1 views
3

С синтаксисом {x:Bind} разметки можно связать с событиями, при условии, что метод удовлетворяет следующие требования:Невозможно привязать к кнопке событиям с помощью й: Bind в DataTemplates - генерирует ошибку XAML

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

Это прекрасно работает за пределами DataTemplate. После связывания происходит внутри DataTemplate компилятор генерирует следующее сообщение об ошибке:

Xaml Internal Error error WMC9999: Object reference not set to an instance of an object.

Что такое затруднительное для привязки к событиям внутри DataTemplates?

Полный код примера here.

Фрагмент примера кода ниже - обратите внимание на первую кнопку (строка 2), и вторая кнопка (строка 6) также прекрасна. Если вы прокомментируете строку 6 и прокомментируете в строке 7, произойдет ошибка.

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Button Tapped="{x:Bind Click}" Content="WORKING"/> 
     <ListView ItemsSource="{x:Bind Names}"> 
      <ListView.ItemTemplate> 
       <DataTemplate x:DataType="local:Customer"> 
        <Button Content="{x:Bind Title}"/> 
        <!--<Button Tapped="{x:Bind Clicky}" Content="{x:Bind Title}"/>--> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackPanel> 
+0

Чтобы быть ясным, вы получаете эту ошибку xaml во время разработки или как ошибка времени выполнения? Кроме того, где действительно находится событие «Clicky»; он найден на странице datacontext страницы? – OmegaMan

+0

Время компиляции - фактически не будет построено. 'Clicky' находится на экземпляре объекта, а не на datacontext страницы. Если бы это была Command + ICommand, я бы сделал '{Binding Clicky}' для доступа к ней –

ответ

5

Я был в состоянии заставить его работать со следующим кодом:

<DataTemplate x:DataType="local:Customer"> 
    <StackPanel Orientation="Vertical"> 
     <Button Tapped="{x:Bind Clicky}" Content="{x:Bind Title}" /> 
    </StackPanel> 
</DataTemplate> 

Похоже, что вам нужно иметь его внутри контейнера для его работы. Я понятия не имею, почему я угадываю магию.

0

Анализатор не может найти Clicky от DataContext кнопки в то время как в шаблоне. Поскольку объект, который передается кнопке в шаблоне (из Names на ItemSource родителя), не совпадает с внешним шаблоном, который имеет Clicky. Вам нужно будет привязать Clicky к datacontext страницы, чтобы заставить его работать.


В противном случае отключите любые операции времени разработки, установив Tapped="{x:Bind Clicky, IsDesignTimeCreatable=False}.

+0

Если на страницах DataContext был Clicky, это невозможно с {x: Bind} из-за этой проблемы: http://stackoverflow.com/ questions/32849864/alternative-to-elementname-in-xbind-with-datatemplates Однако Clicky относится к контексту связанного элемента, поэтому никакого обхода не требуется. –

+0

@RobertMacLean является исключением из-за операций в «Clicky»? См. Обновление, – OmegaMan

+0

Нет - не с этим вообще. Бывает, когда он компилируется, поэтому не ударяйте время дизайна –

Смежные вопросы