Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在Silverlight数据模板中绑定事件?_Silverlight_Events_Binding_Datatemplate - Fatal编程技术网

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

是否可以在Silverlight数据模板中绑定事件?,silverlight,events,binding,datatemplate,Silverlight,Events,Binding,Datatemplate,是否可以在Silverlight数据模板中绑定事件?如果是,最好的方法是什么 例如,假设您创建了一个DataTemplate,其中包含一个按钮,如下所示: <UserControl.Resources> <DataTemplate x:Key="MyDataTemplate" > <Grid> <Button Content="{Binding ButtonText}" Margin="4" /> </

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

例如,假设您创建了一个DataTemplate,其中包含一个按钮,如下所示:

<UserControl.Resources>
  <DataTemplate x:Key="MyDataTemplate" >
     <Grid>
        <Button Content="{Binding ButtonText}" Margin="4" />
     </Grid>
  </DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
  <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />    
</Grid>
<UserControl.Resources>
  <DataTemplate x:Key="MyDataTemplate" >
     <Grid>
        <Button Click="{Binding OnItemButtonClick}" Content="{Binding ButtonText}" Margin="4" />
     </Grid>
  </DataTemplate>
</UserControl.Resources>
那么,如何从列表中的DataTemplate中的每个按钮捕捉到按钮单击?是否可以使用绑定将单击事件绑定到“MyButtonClass”中的方法,如下所示:

<UserControl.Resources>
  <DataTemplate x:Key="MyDataTemplate" >
     <Grid>
        <Button Content="{Binding ButtonText}" Margin="4" />
     </Grid>
  </DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
  <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />    
</Grid>
<UserControl.Resources>
  <DataTemplate x:Key="MyDataTemplate" >
     <Grid>
        <Button Click="{Binding OnItemButtonClick}" Content="{Binding ButtonText}" Margin="4" />
     </Grid>
  </DataTemplate>
</UserControl.Resources>

这样行吗?如果是这样,我应该在“MyDataClass”中添加什么来捕获事件

谢谢,
杰夫

有两种选择

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

我认为你的点击绑定不起作用。无绑定状态,只需将单击声明为字符串

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

通过向包含单击事件的列表框中添加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);
        }

    }
}
公共类MyClass
{
公共字符串ItemText{get;set;}
}
公共部分类页面:UserControl
{
可观察到的收集项目;
公共网页()
{
初始化组件();
_Items=新的ObservableCollection();
对于(int i=0;i<10;i++)
{
_Add(newmyclass(){ItemText=string.Format(“Item-{0}”,i)});
}
this.ListBoxThingee.ItemsSource=\u Items;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
按钮_b=发送器作为按钮;
如果(_b!=null)
{
字符串_s=_b.内容作为字符串;
MessageBox.Show(_s);
}
}
}

我要做的是创建一个使用命令模式进行单击处理的按钮。在.NET 4 framework中,您可以将
命令绑定到视图模型上的命令。

这正是命令更好的原因。在.NET 4 framework中,您可以绑定命令(与事件不同)因此,您仍然可以使用MVVM,而不需要查看代码和绑定功能。