将事件处理程序分配给通过数据绑定创建的资源字典中定义的元

时间:2012-10-05 21:43:40

标签: c# xaml windows-8 microsoft-metro resourcedictionary

我有一个C#XAML Windows 8项目。

HubPage.xaml包含名为 HubGridView GridView HubGridView 使用名为 HubItemTemplateSelector 的自定义ItemTemplateSelector HubItemTemplateSelector 选择名为 HubResourceDictionary.xaml DataTemplate文件中定义的名为 AdDataTemplate ResourceDictionary AdDataTemplate 包含名为 HubAdControl AdControl元素。

我需要能够将HubAdControl s ErrorOccurred事件处理程序设置为某个地方代码隐藏中定义的方法。我该如何做到这一点?

HubPage.xaml:

<GridView x:Name="HubGridView" ItemTemplateSelector="{StaticResource HubItemTemplateSelector}" />

HubResourceDictionary.xaml:

<DataTemplate x:Key="AdDataTemplate">
    <Grid>
        <UI:AdControl x:Name="HubAdControl" />
    </Grid>
</DataTemplate>

2 个答案:

答案 0 :(得分:0)

它的工作方式就像您认为的那样:

<Grid.Resources>
    <DataTemplate x:Key="MyTemplate">
        <TextBlock Loaded="TextBlock_Loaded_1">Hello World</TextBlock>
    </DataTemplate>
</Grid.Resources>

<GridView ItemTemplate="{StaticResource MyTemplate}" />

在我的示例中,每次渲染TextBox时都会引发Loaded - 这是绑定到GridView的ItemsSource的每个项目。您可以轻松使用OnError之类的其他事件。它与资源无关。它与绑定到转发器的结果并不重要。

有意义吗?

答案 1 :(得分:0)

你现在可能已经想到了这一点,但我遇到了同样的问题。

我不确定我是否理解杰里的回答是100%。我尝试将AdControl放在这样的资源文件中:

<强> Templates.xaml

<DataTemplate x:Key="AdTemplate1">
        <StackPanel Margin="70,40,70,140" HorizontalAlignment="Center" VerticalAlignment="Center">
            <ui:AdControl 
                ApplicationId="d25517cb-12d4-4699-8bdc-52040c712cab" 
                AdUnitId="10043030" HorizontalAlignment="Center" 
                Height="600" Margin="0,0,0,0" 
                VerticalAlignment="Center" Width="300" ErrorOccurred="OnAdError" />
        </StackPanel>
</DataTemplate>

然后在我的xaml中,我使用DataTemplateSelector引用了DataTemplate。我尝试在我使用DataTemplate的xaml代码中创建OnAdError事件处理程序。我遇到了运行时异常,资源模板需要OnAdError方法。

也许我错过了一些东西,我当然不是XAML和Windows 8(.1)应用程序的专家。但是,我最终做的是创建一个带有控件的UserContol以及后面代码中的OnAdError处理程序,并在资源文件中引用此UserControl。现在一切都按预期工作了,我得到了一个奖励,我可以收集这个用户控件中的所有广告逻辑。下一步是动态更改AdUnitId :)