复选框[内部列表框的ItemTemplate]经过事件不被触发(CheckBox [Inside L

2019-10-30 04:07发布

这是我的xaml

    <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 。但我没有得到Checked的事件CheckBoxViewModel
我想从我的ViewModel获得经过事件。
任何人都可以有任何想法来解决这个问题?

Answer 1:

您ListBox.ItemTemplate的每个实例都自动获得“集合中的当前项目”作为它的DataContext的。 在你的情况,那就是在HistoryCollection各个项目。 在您的例子中,EventTrigger正在搜索“ThumbsUpCheckedCommad”您当前的HistoryItem的实例内。

为了迫使EventTrigger在您需要的视图模型进行搜索,您需要指定您的命令结合“源”属性。 我建议使用的RelativeSource语法,搜索了树的最后的控制让您的视图模型作为它的DataContext。

它会是这个样子。

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


Answer 2:

我把它通过绑定Command通过这种方式

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


文章来源: CheckBox [Inside ListBox ItemTemplate] Checked Event is not triggering