2009-03-26 16 views
12

Bir Etkinliği Silverlight DataTemplate'de bağlamak mümkün mü? Eğer öyleyse, bunu yapmanın en iyi yolu nedir? SonraBir Etkinliği Silverlight DataTemplate'de bağlamak mümkün mü?

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

, böyle bir liste kutusu ItemTemplate uygulamak: Örneğin

, böyle İçinde Düğme sahip bir DataTemplate oluşturduk demek

<Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />  
</Grid> 

sınıfın nesneleri listeye listbox en ItemSource ayarlarsanız:

public class MyDataClass 
{ 
    public string ButtonText{ get; set; } 
} 

Nasıl o zaman inci yakalamak do e düğmesi, listedeki DataTemplate'den her düğmeyi tıklar mı? Böyle, "MyButtonClass" bir yönteme tıklayın olayı bağlamak bağlayıcı kullanabilir miyim:

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Click="{Binding OnItemButtonClick}" Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

misiniz bu iş? Eğer öyleyse, olayı yakalamak için "MyDataClass" 'a ne koymalıyım?

sayesinde Jeff

+0

Bu, Komutların daha iyi olmasının nedeni budur. .NET 4 çerçevesinde, komutları (olaylardan farklı olarak) bağlayabilirsiniz, böylece MVVM'yi görünüm kodu olmadan ve işlevselliği bağlamadan kullanabilirsiniz. –

cevap

4

seçeneklerin bir çift vardır.

One. Bu satırın veri nesnesine bağlı özel bir denetim yapın. Bu özel kontrolde, bağlı nesne için işleyiciyi ekleyin.

Tıklamada bağlanmanızın işe yaramayacağını düşünüyorum. Bağlama İstasyonuna sadık kalın ve sadece bir dizgeye tıkladığınızı bildirin.

İşleyiciyi, denetimin bulunduğu sayfada ekleyin. Bu şekilde bağlarsanız, yalnızca o öğenin göndericisiyle (düğme) ve özelliklerle çalışabileceğinizi unutmayın. Bir nesnedeki belirli özniteliklere erişmeniz gerekiyorsa, ilk seçeneği takip etmeniz daha iyi olabilir.

Küçük Tıklatma olayları olan bir liste kutusuna 10 düğme ekleyerek işlevselliği gösteren örnek. HTH

DataTemplate XAML

<UserControl.Resources> 
    <DataTemplate x:Name="MyDataTemplate"> 
     <Grid> 
      <Button Click="Button_Click" Content="{Binding ItemText}"/> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

ListBox XAML Ben ne yapardım

public class MyClass 
{ 
    public string ItemText { get; set; } 
} 


public partial class Page : UserControl 
{ 
    ObservableCollection<MyClass> _Items; 
    public Page() 
    { 
     InitializeComponent(); 

     _Items = new ObservableCollection<MyClass>(); 

     for (int i = 0; i < 10; i++) 
     { 
      _Items.Add(new MyClass() {ItemText= string.Format("Item - {0}", i)}); 
     } 

     this.ListBoxThingee.ItemsSource = _Items; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Button _b = sender as Button; 
     if (_b != null) 
     { 
      string _s = _b.Content as string; 
      MessageBox.Show(_s); 
     } 

    } 
} 
2

oluşturmak (ben sadece tüm page.xaml dosyasına bu takılı arkasında

<ListBox x:Name="ListBoxThingee" ItemTemplate="{StaticResource MyDataTemplate}"/> 

Kod olduğu

Tıklatma işlemek için komut desenini kullanan bir düğme .NET 4 çerçevesindebağlayabilirsiniz Görünüm modelinde bulunanlara.