模型方法绑定在xaml中不起作用

时间:2015-10-13 17:36:49

标签: c# xaml mvvm data-binding uwp

我正在使用MVVM创建一个UWP应用程序。在我的xaml视图中,我有一个绑定到ObservableCollection的ListView,而Object_X是一个模型。在此列表视图中绑定到我的xaml视图的Object_X的其他属性正常工作。但是,我在这个列表视图中有一个按钮,其click事件我想绑定到我在Object_X类中定义的方法,但是当我编译我的代码时,我得到一个“对象引用未设置为一个实例对象错误“。

这是我的xaml代码。 ObjectXCollection是我的视图模型中的属性。 IsSelected和Value是Object_X的属性,并且该绑定工作正常。 ExpandButtonHandler也被定义为Object_X类中的一个方法,但它给了我错误。如果我删除该click属性,我的代码构建并运行正常。我的模型正在实现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>

2 个答案:

答案 0 :(得分:1)

您不能绑定到Method,也不能将绑定分配给EventHandler。默认情况下,您只能将DependencyProperties设置为Binding对象。

通常,如果我想基于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();
}

答案 1 :(得分:1)

Classic Binding不允许直接绑定到方法,但新编译的绑定x:Bind允许。您可以阅读more about compiled data binding here

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