我正在使用 Silverlight,但我也对 WPF 答案感兴趣
我有一个数据绑定(bind)到“收藏夹”链接列表的列表。每个收藏夹都包含一个姓名和一个电话号码。
该列表绑定(bind)到描述图形方面的 DataTemplate。在这个模板中有一个按钮——拨号。当您单击该按钮时,我希望调用收藏夹的 Dial() 方法。现在调用页面/窗口的 Dial 方法。
如果这是不可能的,有没有办法让我的收藏夹以某种方式附加到按钮上?这样我就知道哪个收藏夹与按下按钮相关联?
下面的 XAML 不起作用,Text="{Binding Name}"效果很好,因为它绑定(bind)到收藏夹上的 Name 属性,但 Click="{Binding Dial}"不会在收藏夹上调用 Dial()。
<DataTemplate x:Key="DataTemplate1">
<StackPanel d:DesignWidth="633" Orientation="Horizontal" Height="93">
<Button x:Name="DialButton" Content="Edit" Click="{Binding Dial}"/>
<TextBlock x:Name="TextBlock" TextWrapping="Wrap" Text="{Binding Name}" FontSize="64" Height="Auto" FontFamily="Segoe WP SemiLight"/>
</StackPanel>
</DataTemplate>
最佳答案
所以应该这样:
<Button CommandParameter="{Binding}" Command="{Binding Dial}"/>
然后您将收到数据对象作为命令参数。在这种情况下,您必须提供一个名为 Dial
的属性并返回一个 ICommand
实现。如果该属性在数据对象上不可用,但在主类(代码隐藏)上不可用,则必须在绑定(bind)中查找它,为此使用 RelativeSource
关键字。
另一种方法是创建一个点击处理程序。在单击处理程序中,您可以将发送者强制转换为 Button(或 FrameworkElement),然后从 DataContext 获取数据对象。我假设您尝试创建这样的解决方案。
private void Button_Click(object sender, RoutedEventArgs e) {
Button btn = (Button)sender;
MyObject obj = btn.DataContext as MyObject;
if(null != obj){
obj.Dial();
// or Dial(obj);
}
}
标记必须如下:
<Button x:Name="DialButton" Content="Edit" Click="Button_Click"/>
主要区别是,我从 Click-Event 中删除了绑定(bind)并注册了一个事件处理程序。
第三种解决方案是在 Button.ClickEvent
的代码后面注册一个处理程序。原理与第二个例子类似。
我不太了解silverlight。也许还有一些其他的事情。
关于wpf - 如何将 Click= 数据绑定(bind)到对象而不是页面上的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220859/