Можно ли связать событие в шаблоне данных Silverlight? - PullRequest
12 голосов
/ 26 марта 2009

Возможно ли связать событие в шаблоне данных Silverlight? Если да, то как лучше это сделать?

Например, скажем, вы создали шаблон данных, в котором есть кнопка, например:

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

Затем вы применяете его к шаблону элемента ListBox, например:

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

Если вы установите ItemSource в ListBox для списка объектов класса:

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

Как тогда вы поймаете нажатие кнопки от каждой кнопки из шаблона данных в списке? Можете ли вы использовать привязку для привязки события Click к методу в «MyButtonClass», например:

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

Будет ли это работать? Если так, что я должен поместить в «MyDataClass», чтобы перехватить событие?

Спасибо, Джефф

Ответы [ 2 ]

4 голосов
/ 27 марта 2009

Есть несколько вариантов.

One. создайте пользовательский элемент управления, который связывает объект данных для этой строки. В этот пользовательский элемент управления добавьте обработчик для связанного объекта.

Я не думаю, что ваша привязка при нажатии будет работать. Sans Binding Statment и просто объявить свой клик на строку.

Добавьте обработчик на страницу, где расположен элемент управления. Имейте в виду, что если вы связываете таким образом, вы сможете работать только с отправителем этого элемента (кнопки) и его свойств. Если вам нужно получить определенные атрибуты объекта, вам, возможно, лучше воспользоваться первым вариантом.

Маленький пример, демонстрирующий функциональность путем добавления 10 кнопок в список со списком событий. НТН

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}"/>

Code Behind (я только что включил все это в файл 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);
        }

    }
}
2 голосов
/ 21 июля 2010

Что я хотел бы сделать, это создать кнопку, которая использует шаблон команды для обработки кликов. В среде .NET 4 вы можете привязать commands к тем, которые существуют в модели представления.

...