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