2016-07-15 32 views
2

我有这个(简化了SO)列表框:上ListBoxItem的执行按钮的命令选择

<ListBox x:Name="CurriculumList" 
      ItemsSource="{Binding FilteredCurriculums}" 
      SelectedIndex="0" 
      SelectionMode="Single" 
      IsSynchronizedWithCurrentItem="True"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Name="TheButton" 
        HorizontalContentAlignment="Stretch" 
        Content="{Binding DisplayMember}" 
        CommandParameter="{Binding Id}" 
        Command="{Binding OpenCurriculumEditViewCommand}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我可以导航上下用键盘来改变选择listBoxItems,但它不会改变的细节查看 - DataTemplate中的Button实际上没有被点击,所以OpenCurriculumEditViewCommand从未得到执行。

任何人都有任何想法我可以做到这一点?

回答

0

好吧,如果你想要执行OpenCurriculumEditViewCommandListBox选择的变化,你可以做到以下几点:

第一:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

然后..

<ListBox x:Name="CurriculumList" 
     ItemsSource="{Binding FilteredCurriculums}" 
     SelectedIndex="0" 
     SelectionMode="Single" 
     IsSynchronizedWithCurrentItem="True"> 

    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction CommandParameter="{Binding Path=SelectedItem.Id, RelativeSource={RelativeSource AncestorType=ListBox}}" Command="{Binding OpenCurriculumEditViewCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 
+0

此'ListBox'的'DataContext'绑定到'FilteredCurriculums'属性,它是ObservableCollection 过滤的'ICollectionView'。 “EventTrigger”如何知道它与“Id”和“OpenCurriculumEditViewCommand”绑定的是哪个“NavigationItemViewModel”? –

+0

我编辑了答案。要绑定到ListBox的SelectedItem的'Id',你可以用它作为''RelativeSource'到'CommandParameter'的'Binding'。 –

0

如果您希望在选择时触发,则根本不应使用Button

+0

我不不一定会有所不同,但可以选择另一种方法。 “不要这样做”,虽然技术上正确,但并不真正帮助。 –

+0

只需绑定“SelectedItem”并在绑定属性的setter中执行命令的逻辑即可。还有几种替代方案,它并不是很复杂。 –

相关问题