ItemsControl中的事件触发器不起作用

时间:2012-08-01 10:46:44

标签: wpf silverlight itemscontrol event-triggers

我有一个按列表填充的Item控件,list是两个参数'Time'和'Description'的集合。对于它,我使用HyperLinkBut​​ton作为时间,使用Label进行描述。

我想要的是,我想使用Main viewModel中的hyperLink按钮的EventTrigger创建click事件。我的代码是:

<ItemsControl 
    x:Name="transcriptionTextControl" 
    ItemsSource="{Binding MyCollectionOfTranscription, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <HyperlinkButton Content="{Binding Time}">
                    <ToolTipService.ToolTip>
                        <ToolTip Content="Time"/>
                    </ToolTipService.ToolTip>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <i:InvokeCommandAction 
                                Command="{Binding HyperLinkButtonCommand}" 
                                CommandParameter="{Binding 
                                    ElementName=transcriptionTextControl }" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </HyperlinkButton>
                <sdk:Label Content="{Binding Description}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

当我构建项目时,它不会给出错误,但是对于hyperLink的ICommand,显示警告为“无法解析符号HyperLinkBut​​tonCommand”,而此事件触发器在此之外工作正常。

没有得到,背后的实际问题是什么,请提出宝贵的建议......

1 个答案:

答案 0 :(得分:1)

首先,

<i:InvokeCommandAction 
    Command="{Binding HyperLinkButtonCommand}" 
    CommandParameter="{Binding 
        ElementName=transcriptionTextControl }" />

Binding正试图在HyperLinkButtonCommand中包含的类型的实例上找到一个名为MyCollectionOfTranscription的属性(您不需要绑定到这个双向)。

(旁注,将ItemsControl发送到您的Command是而不是 MVVM。)

ItemsControl遍历此集合中的每个元素,创建ItemsControl.ItemTemplate中定义的模板的副本,并将BindingContext设置为等于此元素(我假设其为Transcript) 。如果您启动数据绑定调试设置,您可以从绑定中找到的警告中找不到HyperLinkButtonCommand

enter image description here

假设

  1. HyperLinkButtonCommand是在ViewModel中定义的命令,
  2. 这个xaml的根是一个Window(可能是UserControl,但我假设在这里)
  3. 您的ViewModel是Window的DataContext
  4. 您可以将绑定更改为以下内容并且它应该可以正常工作(或者您应该从中获取线索)

    <i:InvokeCommandAction 
        Command="{Binding HyperLinkButtonCommand, 
                  RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
        CommandParameter="{Binding 
            ElementName=transcriptionTextControl }" />
    

    我更喜欢只给我的root x:Name“root”并在这种情况下使用“ElementName = root”。