12

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

例如,假设您创建了一个包含 Button 的 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”中添加什么来捕捉事件?

谢谢,杰夫

4

2 回答 2

4

有几个选项。

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

我不认为你对点击的绑定会起作用。没有绑定状态,只需将您的点击声明为一个字符串。

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

通过将 10 个按钮添加到具有单击事件的列表框来演示功能的小示例。高温高压

数据模板 XAML

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

列表框 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);
        }

    }
}
于 2009-03-26T22:33:23.233 回答
2

我要做的是创建一个使用命令模式进行点击处理的按钮。在 .NET 4 框架中,您可以绑定commands到视图模型中存在的那些。

于 2010-07-21T19:27:08.830 回答