2011-07-31 100 views
3

我有一些XAML看起來像Windows Phone 7的應用程序:事件綁定到按鈕一個ItemsControl

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

那麼,我應該如何去附加我的事件處理程序,以便我可以響應被點擊的按鈕?

回答

3

我還沒有做過任何Windows 7 Phone開發,但是我已經用C#做了大量的XAML + Silverlight開發,現在我開始做一些F#開發。我會採取的方法是根本不使用事件處理程序。由於您使用的是按鈕,請創建一個派生自ICommand的類,並將該類型添加爲ViewModel上的公共屬性,以便將其綁定到該按鈕的Command屬性。與事件處理程序相比,使用接口的好處在於,您還可以在啓用按鈕時執行此操作。

此外,採取注意到當您正在做在ItemsControl控制範圍內(即ItemTemplate中)綁定表達式項的可以綁定到什麼性質的範圍被減小到當前項的屬性。因此,ViewModel的所有屬性超出範圍,,除非您完全指定它,即<Button Command={Binding Source=ViewModel, Path=Property1.Property2.etc} />。讓我知道這是否有幫助。

+0

Thankyou回答 - 不幸的是我已經嘗試了這種方法,事實證明wp7基於Silverlight 3,它不支持命令。所以沒有按鈕的命令屬性。儘管如此,我可能會稍後再提供這個功能,因爲我相信芒果更新可能會增加此功能,但我必須嘗試針對較新的平臺。 –

+1

所以我最終將項目升級到了7.1平臺的目標,在按鈕中添加了一個命令屬性,並且把所有東西都吸引住了。儘管編輯抱怨命令屬性沒有在按鈕上找到,它確實設法編譯和運行。和工作。 –

相關問題