2016-11-15 99 views
0

我试着从我的datatemplate中调用模型类中的方法,但似乎没有编译。给出错误“未将对象引用设置为对象的实例”。X:将数据绑定到事件

On pointerPressed我想在我的lvitem调用中使用X:bind来调用方法“Poke”。

MyViewModel

Imports Windows.UI 
Namespace MyViewModel 
Public Class MyViewModel 
    Implements INotifyPropertyChanged 
    Private Sub NotifyPropertyChanged(Optional propertyName As String = "") 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    Private Name As String 

    Private List_Items As New ObservableCollection(Of lvitem) 

    Public Property _Name As String 
     Get 
      Return Name 

     End Get 
     Set(value As String) 
      Name = value 
      NotifyPropertyChanged() 
     End Set 
    End Property 
    Public Sub New() 
     Name = "Cater" 
     Dim lvi As New lvitem 
     Dim lvi2 As New lvitem 
     List_Items.Add(lvi) 
     List_Items.Add(lvi2) 
    End Sub 

    Public Property ListItems As ObservableCollection(Of lvitem) 
     Get 
      Return List_Items 
     End Get 
     Set(value As ObservableCollection(Of lvitem)) 
      List_Items = value 
     End Set 
    End Property 
    Public Sub ClickMe() 
     _Name = "Clicked" 

    End Sub 
End Class 
End Namespace 

代码隐藏

Public NotInheritable Class MainPage 
Inherits Page 
Public Property ViewModel() As MyViewModel.MyViewModel 
    Get 
     Return m_ViewModel 
    End Get 
    Set 
     m_ViewModel = Value 
    End Set 
End Property 
Private m_ViewModel As MyViewModel.MyViewModel 
Public Sub New() 

    Me.InitializeComponent() 

    ViewModel = New MyViewModel.MyViewModel 
End Sub 

Private Sub Rectangle_PointerPressed(sender As Object, e As PointerRoutedEventArgs) 

End Sub 

Private Sub TextBlock_PointerPressed(sender As Object, e As PointerRoutedEventArgs) 

End Sub 
End Class 

LVITEM类 - 模型

Public Class lvitem 
Public Sub New() 

End Sub 
Public Sub Poke(sender As Object, e As Object) 
    Dim meint As Integer 
    meint = 3 
End Sub 
End Class 

回答

1

给出错误“未将对象引用设置为对象的实例”。

是的,我们发现了一些问题:在DataTemplate中绑定x:DataType。

以下是我们需要照顾,现在的一些要点:

  1. 确保有Panel包含在DataTemplate

  2. 元素TextBlock控制,如果我们需要使事件x:绑定绑定起作用,则Text属性必须设置为x:绑定绑定。

我简化您的摄制演示和规范一些命名问题:

lvitem.vb:

Public Class lvitem 
    Public Sub Poke(sender As Object, e As PointerRoutedEventArgs) 
     Dim meint As Integer 
     meint = 3 
    End Sub 

    Private _Name As String 

    Public Property Name() As String 
     Get 
      Return _Name 
     End Get 
     Set(ByVal value As String) 
      _Name = value 
     End Set 
    End Property 
End Class 

MyViewModel.vb:

Imports Windows.UI 

Namespace MyViewModel 
    Public Class MyViewModel 
    Implements INotifyPropertyChanged 
    Private Sub NotifyPropertyChanged(Optional propertyName As String = "") 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    Private _Name As String 

    Public List_Items As New ObservableCollection(Of lvitem) 

    Public Property Name As String 
     Get 
      Return _Name 

     End Get 
     Set(value As String) 
      _Name = value 
      NotifyPropertyChanged() 
     End Set 
    End Property 
    Public Sub New() 
     Name = "Cater" 
     Dim lvi As New lvitem With {.Name = "Item1"} 
     Dim lvi2 As New lvitem With {.Name = "Item2"} 
     List_Items.Add(lvi) 
     List_Items.Add(lvi2) 
    End Sub 
    End Class 
End Namespace 

查看:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <ListView Margin="0,100,0,0" Grid.Column="0" ItemsSource="{x:Bind m_ViewModel.List_Items}" > 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="local:lvitem"> 
       <Grid> 
        <TextBlock PointerPressed="{x:Bind Poke, Mode=OneWay}" Text="{x:Bind Name}"/> 
       </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <TextBlock Margin="0,100,0,0" Grid.Column="1" Text="{x:Bind m_ViewModel.Name, Mode=TwoWay}"/> 
</Grid> 

也请注意,的PointerPressed事件将不会被触发,其原因是在这里:Can't fire PointerPressed event from a Listbox in WinRT