我有一个 Windows Phone 7 应用程序,其中包含一些 xaml,如下所示:
<Grid x:Name="ContentGrid" Grid.Row="1">
<ItemsControl x:Name="MyView" ItemTemplate="{StaticResource MyInner}"/>
</Grid>
这里的项目模板如下所示:
<DataTemplate x:Key="MyInner">
<ItemsControl ItemsSource="{Binding}" ItemTemplate="{StaticResource MyInner_Item}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
最后,MyInner_Item 模板如下所示:
<DataTemplate x:Key="MyInner_Item">
<Button x:Name="MyButton">
<Button.Template>
<ControlTemplate>
<Border HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="myborder">
<Image Source="{Binding Path=ImageUri}" Width="{Binding Path=Width}" Height="{Binding Path=Height}" Stretch="Fill" />
</Border>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
因此,它是一个 ItemsControl,其中包含一个 ItemsControl,其中又包含按钮。这实质上创建了一个二维按钮数组。
我想要做的是将事件处理程序添加到按钮的 Click 事件中。
问题是:这背后的代码是用 F# 编写的。据我所知,我无法在 XAML 中指定我的事件处理程序,因为 F# 无法以任何良好的方式与 WPF 通信。所以我需要在代码中手动添加事件处理程序。
有一个简单的方法可以做到这一点吗?
目前,我有一些 F#,如下所示:
let myView : ItemsControl = this?MyView
do myView.ItemsSource <- viewModel.BoardData
这里,BoardData 是列表的列表。
我想知道是否可以循环遍历 ItemsControl 中的控件来添加我的事件处理程序?不过,我在做这件事时遇到了一些麻烦。例如,在以下内容中:
let container = myView.ItemContainerGenerator.ContainerFromItem(myView.Items.[0])
...将容器设置为空。事实上,我从 myView.ItemContainerGenerator 尝试过的所有方法都返回 null。
那么,我应该如何附加我的事件处理程序,以便我可以响应被单击的按钮?