【问题标题】:Databinding and Eventhandles - Passing Parameters数据绑定和事件句柄 - 传递参数
【发布时间】:2012-09-11 11:53:15
【问题描述】:

我有一个 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 元素的“名称”。为什么?

提前致谢!

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案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 类中的字段 - 这样您将始终将正确的状态存储在正确的对象中,并且处理会很多更简单。

    【讨论】:

    • 不知道“标签”...很好!这真的很好用!我不想通过双向绑定来做到这一点,因为在应用程序的其他部分我想保存这些设置以供下次启动,将 tem 写入 XML 等。非常感谢!
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多