2016-11-15 3 views
0

내 데이터 클래스에서 내 모델 클래스의 메서드를 호출하려고하는데 컴파일하는 것 같지 않습니다. "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 오류 메시지를 표시합니다.X : 데이터 템플릿을 이벤트로 바인딩

On pointerPressed 내 lvitem 호출에서 X : bind를 사용하여 "Poke"메서드를 호출하려고합니다.

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

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에 x : bind에 대한 몇 가지 문제점을 발견했습니다.

가 여기에 우리가 지금 조심해야 할 몇 가지 사항은 다음과 같습니다

  1. PanelTextBlock 제어를위한 DataTemplate

  2. 의 요소를 포함하는 것을 확인, 이벤트 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

관련 문제