是否可以在 Silverlight DataTemplate 中绑定事件?

Posted

技术标签:

【中文标题】是否可以在 Silverlight DataTemplate 中绑定事件?【英文标题】:Is it possible to bind an Event in a Silverlight DataTemplate? 【发布时间】:2010-10-15 15:50:36 【问题描述】:

如果是这样,最好的方法是什么?

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

谢谢, 杰夫

【问题讨论】:

这正是命令更好的原因。在 .NET 4 框架中,您可以绑定命令(与事件不同),因此您仍然可以使用没有视图代码隐藏和绑定功能的 MVVM。 【参考方案1】:

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

【讨论】:

【参考方案2】:

有几个选项。

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

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

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

通过向带有单击事件的列表框添加 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);
        

    

【讨论】:

以上是关于是否可以在 Silverlight DataTemplate 中绑定事件?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?

是否可以从 WebPart 获得对 silverlight 页面的引用?

Silverlight 财务数据

是否有可能弄清楚IE是否从C#或PowerShell代码重新下载Silverlight xaps?

Silverlight 与 jQuery 是不是“相同”?

Silverlight 3.0“推送”能力信息