是否可以在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”中加入什么来捕捉事件?
谢谢, 杰夫
答案 0 :(得分:4)
有几种选择。
一。创建一个绑定该行的数据对象的自定义控件。在该自定义控件上添加绑定对象的处理程序。
我不认为你对点击的绑定会起作用。 Sans the Binding Statment只是将你的点击声明为字符串。
在包含控件的页面上添加处理程序。 请记住,如果以这种方式绑定,您将只能使用该项目的发送者(按钮)及其属性。如果您需要获取对象的特定属性,最好选择第一个选项。
通过向单击事件添加10个按钮到列表框来演示功能的小示例。 HTH
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}"/>
Code Behind(我只是将这一切插入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);
}
}
}
答案 1 :(得分:2)
我要做的是创建一个按钮,使用命令模式进行点击处理。在.NET 4框架中,您可以将commands
绑定到视图模型上存在的那些。