代码之家  ›  专栏  ›  技术社区  ›  cjbarth

将DisplayMemberPath设置为字典的结构值成员

  •  3
  • cjbarth  · 技术社区  · 14 年前

    我有一个列表框 ItemsSource Dictionary(Of String, ColumnMetadata) . ColumnMetadata 是一个结构。我可以很容易地得到 DisplayMemberPath 通过将其设置为 "Key" ,但我不知道如何让它显示我的结构的成员。

    我试过设置 显示成员路径 "{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 回复  |  直到 14 年前
        1
  •  2
  •   Homam    14 年前

    我测试过 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;
         }
     }
    

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

    祝你好运!

        2
  •  0
  •   cjbarth    14 年前

    我把代码改成了一个类并重写了 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 以显示结构的特定成员。