#mvvmcross
#mvvmcross
Вопрос:
Я начал использовать observable ConcurrentDictionary, потому что он потокобезопасен. Но теперь я сталкиваюсь с проблемой, как привязать его к списку.
local:MvxBind="ItemsSource SourceDictionary"
очевидно, не может работать, потому что item состоит из KeyValuePair, а не самого объекта.
local:MvxBind="ItemsSource SourceDictionary.Values"
не работает. Что, должен признать, меня озадачивает.
Я даже попробовал длинный снимок и сделал какой-то конвертер :
public class SourceDictionaryValueConverter : MvxValueConverter<KeyValuePair<string, SourceClass >, SourceClass >
{
protected override SourceClass Convert(KeyValuePair<string, SourceClass> value, Type targetType, object parameter, CultureInfo culture)
{
return value.Value;
}
}
и привязать его следующим образом
local:MvxBind="ItemsSource SourceDictionary, Converter=SourceDictionary"
но это не сработало. Я полагаю, он запрашивает IList.
Есть ли какой-либо способ привязать ListView к словарю?
Ответ №1:
Вы должны иметь возможность привязываться к словарю — или даже к любому IEnumerable
.
Если вы привязываетесь к самому словарю (а не к Values
), тогда вам нужно будет написать привязки к своим элементам, чтобы они знали о KeyValuePair — например, поэтому вам может потребоваться привязка к Key.Name
, а не просто Name
.
Однако сами словари не уведомляют слушателей об изменениях, поэтому использование словаря похоже на использование списка, а не на использование ObservableCollection. Если вы хотите такого поведения, вам нужно будет написать или найти класс Dictionary, который реализует INotifyCollectionChanged .
Комментарии:
1. Я использовал ObservableConcurrentDictionary, который я нашел на github, он работает, но я все еще не получаю привязку. Предположим, что есть ListItemViewModel с именем общедоступного свойства, а в MainViewModel есть общедоступное свойство ObservableConcurrentDictionary<строка, ListItemViewModel> VMList . Когда я привязываю ListView в MainView к VMList, он показывает пустые элементы. Итак, проблема в привязках ListItemView. Привязка к ключу. Имя не работает, и, честно говоря, я его не понимаю. Как shold <TextView local:MvxBind=»Текст Key.Name «> работать? ListItemViewModel не знает ключа свойства. Я уверен, что я что-то перепутал: (
2. Мой плохой. Слишком много одной асинхронности:( Dictionary.Values делает свое дело. Спасибо за вашу помощь