2013-02-08 69 views
0

这是我xaml
复选框[内部列表框的ItemTemplate]经过事件不被触发

<ListBox x:Name="HistoryList"   
        ItemsSource="{Binding HistoryCollection}" 
         > 
     <ListBox.ItemTemplate > 
      </DataTemplate>     
        <CheckBox x:Name="UpCheckBox" Height="50" Width="50" > 
         <interactivity:Interaction.Triggers> 
          <interactivity:EventTrigger EventName="Checked"> 
           <interactivity:InvokeCommandAction Command="{Binding UpCheckedCommad}" CommandParameter="{Binding ElementName=UpCheckBox}"></interactivity:InvokeCommandAction> 
          </interactivity:EventTrigger> 
         </interactivity:Interaction.Triggers> 
        </CheckBox>     
      </DataTemplate> 
     </ListBox.ItemTemplate > 
    </ListBox > 

ViewModel我用GalasoftMVVM Command Binding

public ICommand UpCheckedCommad 
    { 
     get { return new RelayCommand<Object>(x => { PerformUpforTracks(x); }); } 
    } 

    void PerformUpforTracks(object x) 
    { 
     //TODO 
    } 

我用了一个CheckBox里面ListBox ItemTemplate。但我不在ViewModel中获得Checked事件CheckBox
我想从ViewModel获取Checked事件。
任何人都可以有任何想法来解决这个问题?

回答

2

我把它通过用这种方式

Command="{Binding Path=DataContext.UpCheckedCommad, 
      ElementName=HistoryList}" 
2

ListBox.ItemTemplate的每个实例都会自动为其DataContext指定“集合中的当前项目”。在你的情况下,这是HistoryCollection中的每个单独项目。在你的例子中,EventTrigger正在当前的HistoryItem实例中搜索“ThumbsUpCheckedCommad”。

为了强制EventTrigger在您想要的ViewModel中进行搜索,您需要指定命令绑定的“Source”属性。我建议使用RelativeSource语法来搜索最后一个Control的树,将ViewModel作为它的DataContext。

它看起来像这样。

{Binding Path=ThumbsUpCheckedCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}} 
+0

你能告诉我该命名空间是属于 'X' 绑定Command? – asitis 2013-02-08 14:01:58

+0

您已经在代码示例中使用了“x”命名空间。它是XAML模式的内置命名空间。 “AncestorType = {x:Type ListBox}”基本上只是说“向上移动树直到我们找到一个ListBox,然后在它的DataContext里面查看我的绑定”。 – BTownTKD 2013-02-08 14:03:35

+0

感谢兄弟的帮助。我得到了答案。无论如何,我没有从'x'获得Type。我不知道它为什么。 – asitis 2013-02-08 14:07:09

相关问题