将DisplayMemberPath设置为Dictionary的Structure Value Member

时间:2010-11-09 22:06:53

标签: wpf listbox binding structure

我有一个列表框,其ItemsSource设置为Dictionary(Of String, ColumnMetadata)ColumnMetadata是一个结构。我可以轻松地让DisplayMemberPath通过将其设置为"Key"来显示密钥,但我无法弄清楚如何让它显示我的结构成员。

我已尝试将DisplayMemberPath设置为"{Binding LocalizedColumn}""Value.LocalizedColumn""LocalizedColumn""{Value.LocalizedColumn}",但这些设置均无效。我的列表框中只有一堆空行。

我想要完成的就是将数据输入列表框。我不关心任何更新回字典,并且在填充列表后字典不会更新。

我现在拥有的代码在运行时被激活:

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

我的结构如下:

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

我在输出窗口中收到以下消息:

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 个答案:

答案 0 :(得分:2)

我测试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}" />
祝你好运!

答案 1 :(得分: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

然后我将运行时分配设置为: 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 的内容,以便显示结构的特定成员。