0

リストで埋めるアイテムコントロールがあり、リストは「時間」と「説明」の2つのパラメーターのコレクションです。そのために、時間には HyperLinkBut​​ton を、説明には Label を使用しています。

私が欲しいのは、メインviewModelのハイパーリンクボタンのEventTriggerを使用してクリックイベントを作成したいということです。私のコードは次のとおりです。

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

プロジェクトをビルドすると、エラーは発生しませんが、ハイパーリンクの ICommand は、「シンボル HyperLinkBut​​tonCommand を解決できません」という警告を表示しますが、このイベント トリガーはこの外部で正常に動作しています。

取得していない、その背後にある実際の問題は何ですか、plzはあなたの貴重な提案をしてください...

4

1 に答える 1

1

最初に、

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

HyperLinkButtonCommandBinding は、含まれている型のインスタンスで呼び出されるプロパティを見つけようとしていますMyCollectionOfTranscription(この双方向にバインドする必要はありません)。

(ちなみに、ItemsControl を Command に送信することは MVVM ではありません。)

ItemsControl、このコレクション内の各要素を繰り返し処理し、 で定義されたテンプレートのコピーを作成し、この要素と等しい値をItemsControl.ItemTemplate設定します (トランスクリプトであると想定しています)。これは、データバインディングのデバッグ設定を上げた場合にバインディングBindingContextが見つからないという警告からわかります。HyperLinkButtonCommand

ここに画像の説明を入力

仮定

  1. HyperLinkButtonCommandViewModel で定義されたコマンドであり、
  2. この xaml のルートは Window です (UserControl の可能性がありますが、ここでは想定しています)
  3. あなたのViewModelはDataContextウィンドウの

バインディングを次のように変更すると、動作するはずです (または、そこから手がかりを得る必要があります)。

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

x:Nameこのような場合は、ルートに「root」を付けて「ElementName=root」を使用することを好みます。

于 2012-08-01T14:21:30.633 に答える