簡體   English   中英

Silverlight,DataTemplate,綁定到單擊事件

[英]Silverlight, DataTemplate, Binding to click event

美好的一天,

我在這里絕望了。 考慮以下用例。

我有一個列表框,其中的項目是自定義模板控件。 它有幾個按鈕,這個自定義控件的代碼后面有事件處理程序。 每當點擊按鈕時,我通過DataContext調用我的自定義控件綁定的對象的方法。 因此,當用戶單擊停止時,我會調用_context.stopDownload(),而對象會執行其余操作。

但是,我有一個按鈕,應該開始播放內容。 我試圖以某種方式在核心級別上聽這個按鈕的點擊事件,而不是在代表列表框項目UI的自定義控件后面的代碼中。

所以,總結一下:

  1. 我有一個核心對象,它將項目列表加載到可觀察集合中。
  2. 然后,此核心對象使用GetTemplateChildnren獲取列表框對象。 完成后,core將listbox控件的ItemsSource設置為我在#1步驟上的可觀察集合。 列表框將使用自定義模板控件作為其項目(使用DataTemplate)進行渲染。
  3. 我需要將核心對象級別上的事件處理程序鏈接到DataTemplate中自定義控件的按鈕元素。

我無法弄清楚#3。 除此之外,我在設置ItemsSource以連接事件處理程序后嘗試做類似的事情,但容器始終為null。

DownloadsListElement.ItemsSource = _downloadsList;

foreach (var item in DownloadsListElement.ItemsSource)
{
    var container = DownloadsListElement.ItemContainerGenerator.ContainerFromItem(item) as     FrameworkElement;
}

我還嘗試在列表框上按一個網格,並嘗試使用Grid的MouseLeftButtonDown / Up上的VisualTreeHelper單擊按鈕,但是當我單擊按鈕時從不調用這些按鈕。

我想當我在某個全局對象中注冊事件處理程序然后從DataTemplate內的自定義控件中調用它時,只有可能的解決方案是使用某種命令模式。

我沒有想法,希望有人有類似這個問題的東西。

謝謝。

更新

感謝McGamagle和ChrisW,我得到了它的工作。 我在按鈕上的最終代碼如下所示:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
        <ei:CallMethodAction TargetObject="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=local:ListBoxExt}}" MethodName="PlayButton_Click"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

感謝大伙們!

我的理解是你想要一個處理程序附加到ListBox項的DataTemplate中的項,其中處理程序屬於父的DataContext。

您可以使用RelativeSource FindAncestor綁定來執行此操作。 您可能需要考慮使用ICommand而不是處理程序,但如果確實需要處理程序,則可以使用Blend SDK的CallMethodAction

XAML應該看起來像這樣(其中“SomeCommand”是ListBox的數據上下文的ICommand屬性):

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding RelativeSource={RelativeSource AncestorType=ListBox},
                                      Path=DataContext.SomeCommand}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

或者使用“CallMethodAction”技術(此處“HandleButtonClick”必須是ListBox數據上下文的公共方法):

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ei:CallMethodAction 
                            TargetObject="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=DataContext.SomeCommand}" 
                            MethodName="HandleButtonClick" />
                    </i:EventTrigger EventName="Click">
                </i:Interaction.Triggers>
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM