2012-02-28 11 views
1

イベントハンドラを作成したカスタムオブジェクトにバインドするにはどうすればよいですか?イベントハンドラをカスタムオブジェクトにバインドする

は、ここに私のXAML私は各ImageTileと一緒にイベントハンドラをバインドしたい

// Create collection 
    ImageTiles = new ObservableCollection<ImageTile>(); 

    // Create each object in the collection 
    ImageTile RSS= new ImageTile("RSS", "/Images/Hard.jpg"); 
    ImageTile test= new ImageTile("test", "/Images/Hard.jpg"); 
    ImageTile Exam= new ImageTile("Exam", "/Images/Hard.jpg"); 
    ImageTile Settings = new ImageTile("Settings", "/Images/Hard.jpg"); 

    ImageTiles.Add(RSS); 
    ImageTiles.Add(test); 
    ImageTiles.Add(Exam); 
    ImageTiles.Add(Settings); 

    this.ListData.ItemsSource = ImageTiles; 

の後ろ

<ListBox x:Name="ListData"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Margin="0,0,0,30"> 
            <Image VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Path=TileImage}" Width="175" Height="175" /> 
            <TextBlock Margin="5" Width="200" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" Text="{Binding Path=TileName}" FontSize="25"/> 
           </StackPanel> 
          </DataTemplate>    
         </ListBox.ItemTemplate> 
        </ListBox> 

コードです。どのようにそうするのか? =)

+0

私はそれを見逃しているかもしれませんが、どのイベントハンドラをバインドしようとしていますか? – Robaticus

+0

@Robaticus異なるイベントを異なるimageTileにバインドしたいだけです。 RSSと呼ばれる1番目のimagetileのように、ユーザーがRSSアイコンをクリックすると、2番目のimagetileが別のページに移動する必要がありますが、それはあるページに移動する必要があります –

答えて

1

MVVMなどを使用していないと仮定してコード構造に基づいて回答しますが、Silverlight開発のパターンをお勧めします。

それにも関わらず、結合あなたのデータソースのようなものになります:あなたが背後にあるコード内の単一の一般的なクリックハンドラを作成し、そのハンドラに画像のクリックイベントを割り当てることができ

<ListBox x:Name="ListData" ItemsSource="{Binding ImageTiles}"> 

</ListBox> 

<ImageButton VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Path=TileImage}" Width="175" Height="175" Click="imageButton_Click" /> 

次に、特定の画像タイルに必要な場所にリダイレクトするメソッドをオブジェクトに作成できます。あなたのViewModelで

private void imageButton_Click(object sender, RoutedEventArgs e) 
{ 
    var imageTile = ((ImageButton)sender).DataContext as ImageTile; 
    imageTile.RedirectSomewhere(); 
} 
+0

心配はありません。私は一緒にアイテムをバインドすることができます。他のイベントを別のimageTileにバインドしたいだけです。 RSSと呼ばれる1番目のimagetileのように、ユーザーがRSSアイコンをクリックすると、2番目の画像は別のページに移動する必要があります。 –

+0

上記の編集内容を確認してください。 – KodeKreachor

+0

あなたのお返事ありがとう=) 今はすばらしそうです。 –

1

、その後、あなたのXAMLで、のSelectedItemを結合し、選択した項目(例えば)

private ImageTile _selectedItem; 
public ImageTile SelectedItem 
{ 
    get {return _selectedItem;} 
    set 
    { 
     if(value != _selectedItem) 
     { 
       _selectedItem = value; 
       RaisePropertyChanged("SelectedItem"); 
     } 
    } 
} 

をキャプチャするためのプロパティを追加します:

その後ハンドラの後ろにあなたのコードでこれに似ているでしょう
<ListBox ItemsSource="{Binding ImageTiles}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
</ListBox> 

MVVM Light(またはその他の方法)を使用して、SelectionChangedイベントをコマンドにバインドするか、SelectionChangedイベントのイベントハンドラを配線します。 Command(またはイベントハンドラ)では、SelectedItemを取得し、最初のプロパティ(呼び出された内容を教えてくれなかったので、何を呼び出すべきかわかりません)を見てください。

何かを実行する前にSelectedItemがnullでないことを確認してください。コマンドを処理したら、SelectedIndexを-1に設定して、同じ項目を2回選択して取得できるようにしてください実行する機能

+0

返信ありがとう= D これはクラスにも付属しているのでより一般的なようです。 オンラインで検索するものは、主にMVVMライトです〜 しかし、それはrelayコマンドを使用しました。<< –