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

是否可以在 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”中添加什么来捕捉事件?

谢谢, 杰夫

【问题讨论】:

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

标签: silverlight events binding datatemplate


【解决方案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);
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-29
      • 2012-08-28
      • 2013-09-20
      • 2011-02-15
      • 2011-05-21
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多