Pytanie Czy można powiązać zdarzenie w Silverlight DataTemplate?


Czy można powiązać zdarzenie w Silverlight DataTemplate? Jeśli tak, jaki jest najlepszy sposób na zrobienie tego?

Załóżmy na przykład, że utworzyłeś DataTemplate z przyciskiem w tym stylu:

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

Następnie stosuje się go do obiektu ListBox ItemTemplate, tak jak poniżej:

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

Jeśli ustawisz ItemSource ListBox na listę obiektów klasy:

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

W jaki sposób można złapać kliknięcie przycisku z każdego przycisku z DataTemplate na liście? Czy możesz użyć wiązania do powiązania zdarzenia Click z metodą w "MyButtonClass", na przykład:

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

Czy to działa? Jeśli tak, to co powinienem umieścić w "MyDataClass", aby złapać wydarzenie?

Dzięki, Jeff


12
2018-03-26 08:58


pochodzenie


Właśnie dlatego Komendy są lepsze. W środowisku .NET 4 można wiązać polecenia (w przeciwieństwie do zdarzeń), dzięki czemu można nadal używać MVVM bez funkcji sprawdzania powiązania kodu i powiązania widoku. - Nate Zaugg


Odpowiedzi:


Istnieje kilka opcji.

Jeden. utwórz niestandardową formant, który jest związany obiektem danych dla tego wiersza. Na tej niestandardowej kontrolce dodaj program obsługi dla obiektu związanego.

Nie sądzę, żeby twoje powiązanie z kliknięciem działało. Sans the Binding Statment i po prostu zadeklaruj kliknięcie jako ciąg znaków.

Dodaj przewodnik na stronie, na której znajduje się kontrolka. Pamiętaj, że jeśli zwiążesz w ten sposób, będziesz mógł pracować tylko z nadawcą tego elementu (przycisku) i jego właściwościami. Jeśli chcesz uzyskać określone atrybuty obiektu, może lepiej skorzystać z pierwszej opcji.

Mały przykład demonstrujący funkcjonalność poprzez dodanie 10 przycisków do pola listy z kliknięciami. HTH

DataTemplate XAML

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

ListBox XAML

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

Kod za (po prostu podłączyłem to wszystko do pliku page.xaml

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);
        }

    }
}

4
2018-03-26 22:33





Chciałbym utworzyć przycisk, który wykorzystuje wzorzec poleceń do obsługi kliknięć. W środowisku .NET 4 można powiązać commands do tych, które istnieją w modelu widoku.


2
2017-07-21 19:27