我正在使用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>
答案 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=">>>" />