0

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

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

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

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

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

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

提前致谢!

4

1 回答 1

1

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

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

<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 类中的一个字段 - 这样您将始终将正确的状态存储在正确的对象中,并且处理将更加简单。

于 2012-09-11T12:32:31.147 回答