2012-09-11 24 views
0

我有一个Windows WPF应用程序,它将类型为'Person'的对象的Observablecollection绑定到列表框。该人通过模板显示,并且该模板为每个人生成“扩展器”(即“查看关于Mr.X的更多细节”)。在expasion中,我想在后台执行一些操作(所以我添加了一个事件处理程序'Expander_Expanded',但我也需要程序来记住哪些扩展器被扩展了,也就是说,我想将该人员的'姓名'传递给虽然我发现了一些类似的问题,但我并不完全明白答案...数据绑定和事件句柄 - 传递参数

另外,也许有人对语言架构有所了解,可以解释为什么语言不允许以下最合乎逻辑的解决方案:将属性添加到人类

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

,然后绑定扩展到这个名称,

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

然后可以通过从'sender.name'中恢复它来访问在事件处理程序中展开的人员的姓名。编译器hwever说,不能绑定UIcontrol元素的'名称'。为什么?

在此先感谢!

回答

1

该名称不是可绑定属性,它需要在编译时知道,以便编译器可以生成要在代码隐藏中访问的适当对象。

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

<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类的字段 - 这样你将永远有存储在正确的对象正确状态,处理将会简单得多。

+0

不知道'标记'...很好!这真的很好!我不想通过双向绑定来实现,因为在应用程序的其他部分,我想为下一次启动保存这些设置,向XML写入代码等。非常感谢! – EluciusFTW