2015-10-13 76 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