Я пытаюсь привязать несколько элементов управления WPF к дереву. Я создал оболочку, которая представляет методы в дереве как свойства. Я пытаюсь отфильтровать список с найденными совпадениями. Когда совпадений слишком много, я не хочу перечислять все совпадения, так как это занимает несколько секунд и совершенно не нужно. Я решил это декларативно, используя MultiBinding, который принимает и ленивые загрузки Matches, а затем NumMatches, который вычисляется намного быстрее. MultiBindingConverter сначала оценивает NumMatches, отправленные в функцию. Если это значение меньше определенного значения, только тогда оно пытается оценить свойство Matches.
Проблема в том, что когда изменяется Matches, изменяется и NumMatches. Таким образом, мой конвертер вызывается два раза, один раз, когда изменяется соответствие, и один, когда изменяется значение NumMatches. Это было бы хорошо, даже если, возможно, немного подвержено ошибкам, если бы WPF не (по-видимому) не кэшировал данные, потому что, хотя оба свойства изменились в то время, свежее значение не извлекается, а используется кэшированное. Преобразователь будет вызываться с несовпадающими аргументами, например, count будет 100 (безопасно для перечисления), но перечисление вызовет доступ к миллиону или двум значениям, поскольку новый список соответствий не выбирается, пока не будет вызван PropertyChanged for Matches (они обновляются в том же свойстве оболочки, помните) Как мне решить эту проблему? Я хочу решить это декларативно.
Мои идеи следующие:
1) Найдите лучший способ решения подкачки, не используя MultiBinding
2) Отключить кэширование
Какой из них наиболее правдоподобен? Насколько я здесь нарушил водопровод WPF?
Вот некоторые из моих XAML:
<ListBox SelectionChanged="ListBox_SelectionChanged" Height="250">
<ListBox.ItemsSource>
<MultiBinding>
<MultiBinding.Converter>
<mine:PagingMultiValue> </mine:PagingMultiValue>
</MultiBinding.Converter>
<Binding Path="Matches"></Binding>
<Binding Path="NumMatches"></Binding>
</MultiBinding>
</ListBox.ItemsSource>
</ListBox>
UPDATE
Вот некоторые из моих TrieWrapper:
public string Text
{
get { return text; }
set
{
if (string.Equals(text, value))
return;
text = value;
OnMatchesChanged();
OnNumMatchesChanged();
OnTextChanged();
}
}
Несмотря на то, что у меня есть контроль над источником моей структуры данных Trie, я бы предпочел не изменять его, выставляя текущие совпадения через свойство. Вот почему у меня есть этот "взломать" вместо этого. Когда вызывается OnMatchesChanged (), он обновляется старым значением NumMatches. Затем непосредственно после этого он обновляется с правильным значением для обоих. Если я изменяю порядок обновлений, единственное, что меняется, - это когда происходит неправильное перечисление, либо когда я добавляю в строку текстового поиска, либо удаляю из нее.
Спасибо!