在Silverlight的数据模板中绑定事件是否可行?

12

是否可以在Silverlight的DataTemplate中绑定事件?如果可以,最好的方法是什么?

例如,假设你已经创建了一个包含按钮的DataTemplate,像这样:

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

然后,你可以将其应用于 ListBox 的 ItemTemplate 中,就像这样:

<Grid x:Name="LayoutRoot" Background="White">
  <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />    
</Grid>
如果您将ListBox的ItemSource设置为一个由该类对象组成的列表:
public class MyDataClass
{
  public string ButtonText{ get; set; }
}

那么如何从列表中的DataTemplate中捕获每个按钮的点击事件呢?您可以使用绑定将Click事件绑定到"MyButtonClass"中的一个方法,像这样:

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

这样做可以吗?如果可以,我该在"MyDataClass"中放什么来捕获事件?

谢谢, Jeff


这正是为什么命令更好的原因。在.NET 4框架中,您可以绑定命令(而不是事件),因此您仍然可以使用MVVM而无需视图代码后台并绑定功能。 - Nate Zaugg
2个回答

4

有几种选择。

一、制作一个自定义控件,将其绑定到该行的数据对象。在该自定义控件上添加绑定对象的处理程序。

我认为您在单击时的绑定不起作用。除去绑定语句,只声明您的单击为字符串。

在包含控件的页面上添加处理程序。请记住,如果以这种方式进行绑定,则只能使用该项(按钮)及其属性的发送者。如果您需要访问对象上的特定属性,则最好选择第一种选项。

通过向列表框添加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}"/>

代码后端(我把所有内容都插入到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

我会创建一个使用命令模式处理点击的按钮。在.NET 4框架中,您可以将commands绑定到视图模型上已经存在的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接