Silverlight MVVM Light Event ToCommand不';不能在WP7数据透视模板内工作

Silverlight MVVM Light Event ToCommand不';不能在WP7数据透视模板内工作,silverlight,windows-phone-7,command,pivot,mvvm-light,Silverlight,Windows Phone 7,Command,Pivot,Mvvm Light,我有一个很奇怪的问题。在我的WP7应用程序中,我在其中定义了一个pivot控件和一个项目模板(或者在参考资料中,我尝试了两种方法,但仍然存在相同的问题)。在模板中,我有一个定义了EventToCommand的常规按钮(EventName=“Click”)。我也有同样的复制粘贴按钮外的轴心。问题是,枢轴外部的按钮工作正常,但内部的按钮不工作。实际上,我已经注意到,我的pivot中的任何命令都不起作用。我在ViewModel中正确地处理了该命令,因为相同的按钮,但在pivot之外工作得很好。 你知道

我有一个很奇怪的问题。在我的WP7应用程序中,我在其中定义了一个pivot控件和一个项目模板(或者在参考资料中,我尝试了两种方法,但仍然存在相同的问题)。在模板中,我有一个定义了EventToCommand的常规按钮(EventName=“Click”)。我也有同样的复制粘贴按钮外的轴心。问题是,枢轴外部的按钮工作正常,但内部的按钮不工作。实际上,我已经注意到,我的pivot中的任何命令都不起作用。我在ViewModel中正确地处理了该命令,因为相同的按钮,但在pivot之外工作得很好。 你知道有什么问题吗?请帮忙。 提前谢谢。 干杯

        <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>
           ...
另外,我的代码相当标准,但以防万一:

    <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>
           ...

        <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代码:

        <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>
           ...
public RelayCommand<string> MyCommand
    {
        get;
        private set;
    }
//And in the constructor ...
MyCommand= new RelayCommand<string>((param) => HandleTheCommand(param));
public relay命令MyCommand
{
得到;
私人设置;
}
//在构造器中。。。
MyCommand=新的RelayCommand((param)=>HandleTheCommand(param));

        <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>
           ...

再次感谢。

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

        <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>
           ...

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

silverlight/WP7的问题在于数据上下文没有在模板中继承。在使用reflector深入研究MVVM lite代码库之后,我发现有一个巧妙的技巧可以让它工作。基本上,不是在原始场景中公开ICommand,而是公开类型绑定的依赖属性。然后,任何实体都可以绑定到此属性,因为绑定可以从可视树计算数据上下文。然后创建一个可观察的绑定类,该类基本上具有一个隐藏的附加属性,该属性绑定到TriggerAction类中依赖属性的绑定。现在,您需要做两件事:
        <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>
           ...
1.在TriggerAction类中,如果绑定DP发生更改,则更新ObservableBinding成员 2.在ObserableBinding类中,如果隐藏的DP发生变化,则计算并存储新值

        <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>
           ...
我希望这也能解决你的问题

        <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>
           ...