2015-10-13 59 views
1

我正在使用MVVM創建一個UWP應用程序。在我的xaml視圖中,我有一個綁定到ObservableCollection的ListView,而Object_X是一個模型。在此列表視圖中綁定到我的xaml視圖的Object_X的其他屬性正常工作。然而,我在這個List View中有一個按鈕,它的點擊事件我想綁定到我在Object_X類中定義的方法,但是當我編譯我的代碼時,我得到一個「Object reference not set to an instance of an對象錯誤「。模型方法綁定在xaml中不起作用

這是我的xaml代碼。 ObjectXCollection是我的視圖模型中的一個屬性。 IsSelected和Value是Object_X的屬性,並且該綁定工作正常。 ExpandButtonHandler也被定義爲Object_X類中的一個方法,但它給了我錯誤。如果我刪除該點擊屬性,我的代碼就會生成並運行良好。我的模型正在實現INotifyPropertyChanged,這就是爲什麼屬性綁定工作正常。有人可以提出解決方案,或者有人可以看到問題嗎?

<ListView ItemsSource="{Binding ObjectXCollection, Mode=TwoWay}"> 
     <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" IsThreeState="True"> 
        <TextBlock Text="{Binding Value}"/> 
       </CheckBox> 
       <Button Content=">>>" Click="{Binding ExpandButtonHandler}"></Button> 
      </StackPanel> 
     </DataTemplate> 
    </ListView> 

回答

1

您不能綁定到一個方法,也不能將綁定分配給一個EventHandler。默認情況下,您只能將DependencyProperties設置爲綁定對象。

通常,如果我想根據UI事件觸發某些ViewModel代碼,我將使用一個AttachedCommandBehavior,它允許您在UI事件處理程序中使用綁定。

最終的結果看起來是這樣的:

<Button x:Name="ExpandButton" Content=">>>" 
     local:CommandBehavior.Event="Click" 
     local:CommandBehavior.Action="{Binding ExpandButtonHandler}" /> 

的備用解決方案是隻使用代碼隱藏模型,並手動調用方法對您的DataContext。並不理想,但它是一種選擇。

private void ExpandButton_OnClick(object sender, EventArgs e) 
{ 
    var vm = ExpandButton.DataContext as SomeViewModel; 
    vm.ExpandButtonHandler(); 
} 
+0

我試圖綁定的方法不在我的viewmodel中,它在我的模型中。 ListView綁定到我的ViewModel中的ObservableCollection,但隨後使用數據模板,DataType變成了Object_X,這就是爲什麼我的屬性與模型綁定在一起工作得很好。我很困惑爲什麼我不能綁定到方法,因爲它應該使用我的Object_X的同一個實例,它用於我的屬性綁定。 – user3079315

+0

@ user3079315沒問題,答案保持不變。 WPF綁定無法綁定到方法。他們只能綁定到公共屬性。有一些[解決方法](http://stackoverflow.com/a/844946/302677),但我仍然建議使用'ICommand'和AttachedCommandBehavior。 – Rachel

1

經典Binding不允許直接結合的方法,但是新編譯的綁定,x:Bind一樣。你可以閱讀more about compiled data binding here

<Button Click="{x:Bind ExpandButtonHandler}" Content=">>>" /> 
+0

我嘗試了x:綁定,但我仍然得到相同的錯誤。我也嘗試明確聲明x:DataType,即使我知道它推斷正確的數據類型導致我的屬性綁定工作正常,但它仍然無法正常工作。 – user3079315

+0

@ user3079315方法ExpandButtonHandler的簽名是什麼? –

+0

public void ExpandButtonHandler() 此外,我使用棱鏡MVVM,所以我沒有對象發件人等 – user3079315