2011-08-24 88 views
7

another question類似,我想通過代碼訪問對象的x:Name屬性,在這種情況下,所討論的對象不是FrameworkElement,因此沒有Name屬性。我也沒有訪問成員變量。如何訪問x:代碼中的名稱屬性 - 對於非FrameworkElement對象?

在我的情況,我有一個ListView命名列,並希望擴展ListView類,以便它保持列布局。對於這個功能,我需要命名的列,並且對我來說重用x:Name屬性是有意義的,因爲我需要爲其他原因設置x:Name屬性,而不是添加附加的「ColumnName」屬性。

我目前的 「解決方案」:

<GridViewColumn Header="X" localControls:ExtendedListView.ColumnName="iconColumn" /> 

期望:

<GridViewColumn Header="X" x:Name="iconColumn" /> 

所以是有可能得到的 「X:名稱」 值不知何故?

回答

6

見IANG的答案在下面的線程:
How to read the x:Name property from XAML code in the code-behind

不幸的是,這並不完全是什麼X:名稱一樣。 x:名稱不是 在技術上屬性 - 這是一個Xaml指令。在 .NET WPF應用程序的情況下,X:名字的意思是這樣的:

「我希望能夠通過這個 名稱的字段有訪問該對象此外,如果這種類型恰好有一個名稱屬性,請設置爲 它的名稱。「

這是您需要的第二部分,不幸的是,第二個 部分不適用於ModelUIElement3D,因爲該類型沒有 屬性來表示名稱。所以實際上,所有這一切意味着「我想要能夠通過此 名稱的字段訪問此對象。」 「。就這樣。

所以,所有的x:Name都是通過創建具有該特定名稱的字段來訪問此對象。如果你想獲得它的x:Name,你必須遍歷所有的字段,看看這個字段是否是你正在尋找的對象,在這種情況下,返回字段名稱。

他確實呈現代碼隱藏文件要做到這一點的方法,雖然我覺得你目前與附加屬性的方法是一個更好的解決方案

public string GetName(GridViewColumn column) 
{ 
    var findMatch = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        let fieldValue = field.GetValue(this) 
        where fieldValue == column 
        select field.Name; 

    return findMatch.FirstOrDefault(); 
} 
+0

謝謝,幫助:) 猜測,附加屬性那麼確實比較適合。 – floele