2012-09-11 23 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