MVVM Light EventToCommand在WP7 Pivot DataTemplate中不起作用

时间:2010-10-29 12:03:45

标签: silverlight windows-phone-7 command pivot mvvm-light

我有一个非常奇怪的问题。在我的WP7应用程序中,我有一个数据透视控件和一个在其中定义的项目模板(或者在资源中,我尝试了两种方式,但仍然是同样的问题)。在模板中,我有一个定义了EventToCommand的常规按钮(EventName =“Click”)。我在Pivot外面也有相同的复制粘贴按钮。问题是枢轴外的按钮工作正常,但内部的按钮不起作用。实际上我已经注意到,我的枢轴内的任何命令都不起作用。我在ViewModel中正确处理了Command,因为相同的按钮,但在pivot之外工作得很好。 任何想法可能是什么问题?请帮忙。 提前致谢。 欢呼声。

P.S。我的代码很标准,但以下是:

    <controls:Pivot Grid.Row="0"
        x:Name="PivotControl"
        Title="{Binding ApplicationTitle}"                         
        ItemsSource="{Binding BlaBla}">

                                                                   

        <controls:Pivot.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                   <Button Content="Click Me">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cmd:EventToCommand Command="{Binding MyCommand, Mode=OneWay}" CommandParameterValue="Test"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
           ...

ViewModel代码:

public RelayCommand<string> MyCommand
    {
        get;
        private set;
    }
//And in the constructor ...
MyCommand= new RelayCommand<string>((param) => HandleTheCommand(param));

...

再次感谢。

2 个答案:

答案 0 :(得分:5)

因为你在控件的ItemTemplate中,所绑定的DataContext不是你的ViewModel。绑定{Binding MyCommand, OneWay}正在尝试从集合BlaBla中找到对象上的属性MyCommand。这是命令模式的一个限制,因为DataTemplates内部的DataContext通常不是您的ViewModel。

真的没有好办法。您可以将命令包含在BlaBla集合中的对象中。您也可以使用自己的触发器来搜索VisualTree中的ViewModel,然后通过反射而不是实际绑定来检索命令。

答案 1 :(得分:1)

silverlight / WP7的问题是数据上下文不是在模板中继承的。在使用反射器挖掘MVVM lite代码库之后,我发现有一个很好的技巧可以让它工作。基本上不是在原始场景中公开ICommand,而是公开Binding类型的依赖项属性。然后,任何实体都可以绑定到此属性,因为Binding可以从可视树中评估数据上下文。然后创建一个可观察的绑定类,它基本上有一个隐藏的附加属性绑定到TriggerAction类的依赖属性的Binding。现在你需要做两件事: 1.在TriggerAction类中,如果绑定DP发生更改,请更新ObservableBinding成员 2.在ObserableBinding类中,如果隐藏的DP发生更改,请评估并存储新值。

我希望这也能解决你的问题。