数据绑定和事件句柄 - 传递参数

时间:2012-09-11 11:53:16

标签: c# wpf data-binding

我有一个Windows WPF应用程序,它将“Person”类型的Observablecollection对象绑定到列表框。 Person通过模板显示,该模板为每个人生成一个“Expander”(即“查看有关Mr.X的更多详细信息”)。在扩展时我想在后台做一些事情(所以我添加了一个事件处理程序'Expander_Expanded',但我还需要程序来记住哪些扩展器被扩展,即,我想将这个人的'名字'传递给虽然我发现了一些类似的问题,但我并不十分理解答案......

此外,也许熟悉语言架构的人可以解释为什么语言不允许以下,最合乎逻辑的解决方案:向人类添加属性

public ExpanderName {get{return "Expander_"+this.Name;}}

然后将扩展器的名称绑定到此,

<Expander Name="{Binding ExpanderName}" Expanded="Expander_PersonDetails">

然后可以通过从'sender.name'恢复来访问在eventhandler中展开的人的名字。编译器hwever说不能绑定UIcontrol元素的'name'。为什么呢?

提前致谢!

1 个答案:

答案 0 :(得分:1)

Name不是可绑定属性,需要在编译时知道,以便编译器可以生成在代码隐藏中访问的正确对象。

您可以使用的是通用标记属性 - 您可以绑定任何您想要的内容,然后您可以在代码中访问它。试试这个:

<Expander Tag="{Binding ExpanderName}" Expanded="Expander_PersonDetails">

void Expander_PersonDetail(object sender, RoutedEventArgs args)
{
  var expander = (Expander)sender;
  string expanderName = (string)expander.Tag;
}

更好的解决方案是将Expander.IsExpanded属性绑定(双向)直接在Person类中的字段 - 这样您将始终将正确的状态存储在正确的对象中,并且处理将会很多简单。