Установка DisplayMemberPath для элемента значения структуры словаря - PullRequest
3 голосов
/ 10 ноября 2010

У меня есть список со значением 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 ]

2 голосов
/ 10 ноября 2010

Я тестировал 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 голосов
/ 10 ноября 2010

Я изменил свой код на класс и переопределил функцию ToString(): <pre> Public Class ColumnMetadata Public LocalizedColumn As String Public Description As String</p> <pre><code> 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, чтобы показать определенный член структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...