是否可以在 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 页面的引用?