Windows phone 7 绑定到Windows Phone 7项数据模板内的MVVM灯光中继命令

Windows phone 7 绑定到Windows Phone 7项数据模板内的MVVM灯光中继命令,windows-phone-7,mvvm-light,Windows Phone 7,Mvvm Light,我正在尝试使用MVVM Light命令将按钮绑定到viewmodel命令,由于某些原因,该命令似乎没有被调用。通常我在使用命令时不会遇到任何问题,但是这个似乎忽略了绑定 这是我的密码: <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <Button> <Interactivity:Interaction.Tri

我正在尝试使用MVVM Light命令将按钮绑定到viewmodel命令,由于某些原因,该命令似乎没有被调用。通常我在使用命令时不会遇到任何问题,但是这个似乎忽略了绑定

这是我的密码:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <Button>
                <Interactivity:Interaction.Triggers>
                    <Interactivity:EventTrigger EventName="Click">
                        <Command:EventToCommand 
                            Command="{Binding MyButtonClickAction}" />
                    </Interactivity:EventTrigger>
                </Interactivity:Interaction.Triggers>
            </Button>

            <StackPanel>
                <TextBlock Text="{Binding MyProperty}"/>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding MyOtherProperty}" />
                </StackPanel>
            </StackPanel>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

这个数据模板在我的应用程序启动后创建的列表中,我想知道这是否是问题所在。我的理论是创建视图模型,构造函数尝试使用relay命令设置绑定,但是由于列表中还没有任何项,绑定以某种方式失败

MyProperty和MyOtherProperty的绑定工作正常


有没有关于如何使其工作的建议?

问题在于,在DataTemplate中,DataContext是项本身,而不是ViewModel。因此,当您说
{Binding MyButtonActionClick}
时,绑定是在项上查找名为
MyButtonActionClick
的命令,我猜它只是一个简单的对象,没有自己的命令属性

有几种方法可以解决这个问题。由于您已经在使用MMVM Light,最好的方法可能是将集合定义为
List
,而不是
List
,并将项目包装在自己的ViewModel类中。然后,您可以向该视图模型添加
MyButtonActionClick
命令,并回调父视图模型


否则,请更改命令绑定,使其查看ItemsControl本身的DataContext。看一下(当然是公认的答案)关于如何做到这一点的想法。

作为一个旁注,您可能需要考虑在使用命令与按钮关联时使用ButnBaseExp展类。此类可以在GalaSoft.MvvmLight.WP7程序集中的GalaSoft.MvvmLight.Command命名空间中找到

然后,您的名称空间XAML将包括:-

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.WP7"
您的按钮XAML将如下所示:-

<Button cmd:ButtonBaseExtensions.Command="{Binding MyButtonClickAction}"/>


谢谢你修改了格式,马特。这很有意义。我想我会选择独立视图模型。谢谢在MVVM Light中,您还可以通过ViewModelLocator找到VM。我个人更喜欢这样。绑定变成{binding Source={StaticResource Locator},Path=Main.MyCommand},其中Main是托管MyCommandI的VM,类似于ViewModelLocator方法。实际上,您不需要“安装”MVVM Light即可使其正常工作。在绑定能力有限的WP7中使用这种方法。哇——我不知道你能做到这一点。这将大大减少我的XAML文件--谢谢!