2010-11-09 41 views
2

我有一個列表框,其ItemsSource設置爲​​。 ColumnMetadata是一個結構。我可以很容易地通過將DisplayMemberPath設置爲"Key"來顯示鍵,但我無法弄清楚如何讓它顯示我的結構的成員。將DisplayMemberPath設置爲字典的結構值成員

我試過設置DisplayMemberPath"{Binding LocalizedColumn}""Value.LocalizedColumn""LocalizedColumn""{Value.LocalizedColumn}"和那些作品沒有。我只是在列表框中看到一堆空行。

我期待完成的所有工作就是將數據存入列表框。我不關心任何更新回到詞典,詞典將不會在列表填充後更新。

我現在已經在運行時激活代碼:

 
     lstDatabaseColumns.ItemsSource = ImportData.GetAddressFieldData 
     lstDatabaseColumns.DisplayMemberPath = "Value.LocalizedColumn" 
     lstDatabaseColumns.SelectedValuePath = "Key" 

我的結構是這樣的:

 
System.Windows.Data Error: 40 : BindingExpression path error: 'LocalizedColumn' property not found on 'object' ''ColumnMetadata' (HashCode=1118531966)'. BindingExpression:Path=Value.LocalizedColumn; DataItem='KeyValuePair`2' (HashCode=-1578744570); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') 

+2

正確的'DisplayMemberPath'是「Value.LocalizedColumn」。如果它不起作用,請檢查VS中的輸出窗口是否存在綁定錯誤 – 2010-11-09 23:17:48

回答

0

我改變了我的代碼到一個類和重寫了ToString()功能:

 
    Public Class ColumnMetadata 
     Public LocalizedColumn As String 
     Public Description As String

Public Overrides Function ToString() As String 
     Return LocalizedColumn 
    End Function 
End Class 

然後我把我的作業運行到:

 
     lstDatabaseColumns.ItemsSource = ImportData.GetAddressFieldData 
     lstDatabaseColumns.DisplayMemberPath = "Value" 
     lstDatabaseColumns.SelectedValuePath = "Key" 

現在一切工作。當用戶點擊列表框中的某個項目,並且想要對類中的其他項執行某些操作時(例如,將其分配給文本框),我已經實現了以下代碼:

 
lblColumnDescription.Text = DirectCast(lstDatabaseColumns.SelectedItem, KeyValuePair(Of String, ImportData.ColumnMetadata)).Value.Description 

使用該方法我現在可以訪問該類的任何部分或字典的關鍵字。

我仍然對知道要設置DisplayMemberPath以便顯示結構的特定成員感興趣。

1

我:

 
    Public Structure ColumnMetadata 
     Dim LocalizedColumn As String 
     Dim Description As String 
    End Structure 

我在我的輸出窗口收到以下消息測試DisplayMemberPath="Value.MyValue",它運作良好。

的樣本數據爲:

public class MyClass 
{ 
    public string MyValue { get; set; } 
} 

public Dictionary<int, MyClass> Data 
{ 
    get 
    { 
     Dictionary<int, MyClass> data = new Dictionary<int, MyClass>(); 
     data[0] = new MyClass { MyValue = "A" }; 
     data[1] = new MyClass { MyValue = "B" }; 

     return data; 
    } 
} 

的XAML:

<ListBox DisplayMemberPath="Value.MyValue" x:Name="lst" ItemsSource="{Binding ElementName=local, Path=Data}" /> 

祝你好運!

+0

我剛剛將我的結構轉換爲類,但它仍然無效。我在運行時做所有的綁定是否重要? (我已經更新了我的問題以包含我的代碼。) – cjbarth 2010-11-09 23:18:25

+0

OP使用了一個結構體,而不是一個類......也許這就是爲什麼它不適合他,儘管我懷疑它會改變任何東西。你有沒有嘗試過一個結構? – 2010-11-09 23:19:18