2010-10-29 117 views
2

我有一个很奇怪的问题。在我的WP7应用程序中,我有一个透视控件和一个定义在其中的项目模板(或者在资源中,我已经尝试了两种方式,但仍然是相同的问题)。在模板中,我定义了一个EventToCommand定义的按钮(EventName =“Click”)。我也在Pivot外面有相同的复制粘贴按钮。问题是,按钮,这是在枢轴以外的工作正常,但其中一个不起作用。其实我已经注意到,我的枢轴内的任何命令不起作用。我正确处理ViewModel中的命令,因为同一个按钮,但在数据透视之外效果很好。 任何想法可能是什么问题?请帮助。 在此先感谢。 干杯。MVVM Light EventToCommand在WP7 Pivot DataTemplate中不起作用

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

而且视图模型代码:

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

...

比ks再次。

回答

1

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

我希望能够解决您的问题。

5

由于您位于控件的ItemTemplate中,因此您绑定的DataContext不是您的ViewModel。绑定{Binding MyCommand, OneWay}正试图从集合BlaBla的对象上找到属性MyCommand。这是命令模式的局限之一,在DataTemplates中你的DataContext通常不是你的ViewModel。

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

+0

谢谢史蒂芬,真的很好的答案。干杯。 – Tech0 2010-10-29 18:06:32

相关问题