|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Доброго времени суток уважаемые знатоки! Вопрос возможно банальный, но никак не могу с ним разобраться. И так: использую RadGridView от Telerik, привязал коллекцию - все работает. Затем решил добавить фильтр по столбцу - то есть пользователь вводит текст и в гриде строки фильтруются. Как то так: Код: xml 1. 2. 3.
FilterValue - это свойства типа string, куда записывается то, что ввел пользователь в textBox. Но как я понимаю, у грида другой datacontext, а как получиться ссылку на datacontext всего usercontrol? Через ElementName не работает( Использую MVVM, для dataContext userControl используется отдельный класс. Устанавливается в другом классе)) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 12:55 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
RelativeSource + AncestorType ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 13:31 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Алексей К, использую Silverlight 4. Там, как я понимаю, нет этого ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 13:58 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Используйте ICollectionView прямо в контексте модели. Создайте на базе вашей коллекции ListCollectionView, либо используйте представление по умолчанию c помощью метода CollectionViewSource.GetDefaultView(object). Затем свойство Filter для данного представления, свойство фильтр имеет тип Predicate<object>, можно в качестве параметра задать название метода с сигнатурой bool MethodName(object value). свяжите ваш ItemsControl с коллекцией (если вы используйте View'у по умолчанию) или непосредственно с View'ой, если вы создаете свою. Затем свяжите строку в которой осуществляете ввод текста для фильтрации со свойством в модели представления и каждый раз когда значение свойство изменяете вызывайте метод Refresh из интерфейса ICollectionView для вашего представления коллекции. У меня есть подозрения, что этот Telerik контрол делает абсолютно тоже самое, нафига в контроле всё это барахло, мне честно говоря не очень понятно. Как по мне, фильтрация и прочее это лишнее, для этого существует CollectionView'хи ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 15:16 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
osvaldvАлексей К, использую Silverlight 4. Там, как я понимаю, нет этогоДа, в SL4 такого нет. Добавлено в SL5. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 16:10 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Алексей КRelativeSource + AncestorType такое не сработает RelativeSource + AncestorType это банальный поиск по логическому дереву. весь фокус в том, что FilterDescriptor вообще не находится в дереве, а является элементом списка свойства и не более. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 16:13 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Roman MejtesАлексей КRelativeSource + AncestorType такое не сработает RelativeSource + AncestorType это банальный поиск по логическому дереву. весь фокус в том, что FilterDescriptor вообще не находится в дереве, а является элементом списка свойства и не более.При создании ячеек грида этот биндинг, вероятно, будет применён к какому-нибудь FrameworkElement, расположенному в визуальном дереве. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 16:19 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Roman Mejtes, спасибо за совет! Честно говоря не хотелось бы связываться с ICollectionView из за такой, казалось мелочи. Есть FilterDescriptor на гриде, свойство Value которого надо привязать на textbox либо на свойство из модели представления.. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 08:10 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
osvaldvRoman Mejtes, спасибо за совет! Честно говоря не хотелось бы связываться с ICollectionView из за такой, казалось мелочи. Есть FilterDescriptor на гриде, свойство Value которого надо привязать на textbox либо на свойство из модели представления.. задайте x:Name для элемента и в CodeBehind сделанай Binding, либо через BindingProxy и статик ресурс, или через DataObjectProvider как вариант ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 15:07 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Roman Mejtes, решил не изобретать велосипеды, а сделать как Вы и писали - через CollectionViewSource. Telerik кстати предлагает аналогичный механизм, но только через свои решения - это я нашел, полазив по форумам. Спасибо большое за ответ! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2015, 00:18 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
И так, может кому пригодится - ответ на мой вопрос, точнее одно из решений проблемы))) Суть описана выше. Как сделал: В модели представления объявил свойство CollectionViewSource viewSource. В конструкторе прописал: Код: c# 1. 2. 3.
Сам фильтр: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Сам пример тестовый, поэтому корявые названия) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2015, 00:24 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Осталось правда два вопроса: 1. У меня коллекция обновляется по нажатию на кнопку, что то типа "Обновить данные" - viewSource при этом не обновляется. Почему это может быть? Ведь коллекция ObservableCollection? Она наследует интерфейс INotifyCollectionChanged.. Или viewSource.Source каждый раз при обновлении исходной коллекции надо переприсваивать? 2. Вопрос возможен банален и так и должно быть - в моем гриде, на SelectedItem забиндино свойство из модели представления. При запуске приложения оно сразу устанавливается на первую строку в гриде. Это особенность viewSource? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2015, 09:57 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
экземпляр CollectionViewSource имеет смысл создавать тогда, когда вы используйте его через XAML, в C# в коде это только создает лишний геморой. Проще всего сделать так: Код: c# 1. 2. 3.
и привязать этот объект view к ItemsControl.ItemsSource через соответствующие свойства модели. На счет текущего элемента. В представлении коллекции есть текущий элемент списка, если быть проще, то попробуйте сделать так: Код: c# 1. 2. 3.
затем создайте 2 ListBox'а и свяжите ItemsSource обоих на View1 и View2 соответственно. Увидите, что текущий элемент выделения при переключении в 1ом, переключается и во 2ом контроле. Дело в том, что View1 и View2 это один и тот же экземпляр класса, следовательно и текущий элемент у них общий. чтоб этого не происходило нужно либо задать для ListBox'а свойство IsSynchronizedWithCurrentItem="False", либо просто создать 2е разные View'и через ListCollectionView. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2015, 14:44 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Roman Mejtes, со вторым вопросом разобрался. Огромное спасибо. Остался первый - пробую сделать как Вы писали, но споткнулся на ListCollectionView - не получается его создать. Ошибка - не доступен из за его уровня защиты (System.Windows.Data.ListCollectionView). Или я просто что то делаю не так.. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2015, 02:47 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
osvaldvRoman Mejtes, со вторым вопросом разобрался. Огромное спасибо. Остался первый - пробую сделать как Вы писали, но споткнулся на ListCollectionView - не получается его создать. Ошибка - не доступен из за его уровня защиты (System.Windows.Data.ListCollectionView). Или я просто что то делаю не так.. пространство имён System.Windows.Data не знаю, на сколько оно доступно в SL, в WPF оно Public. проверьте может вы не тот конструктор вызываете ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2015, 08:00 |
|
Как получиться datacontext usercontrol?
|
|||
---|---|---|---|
#18+
Roman Mejtes, проверил. Все правильно. В SL не доступен, а в WPF доступен (ради интереса создал тестовое wpf приложение). Вот они "приятные" неожиданности silverlight(( Вопрос обновление source у view решил простым присваиванием)) То есть когда пользователь запрашивает данные с сервера (через webclient в моем случае реализовано) то после того, как ObservableCollection получена она снова присваивается view.source. Не знаю, правда, насколько этот подход неправильный... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2015, 23:41 |
|
|
start [/forum/topic.php?fid=21&msg=39083859&tid=1440786]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 255ms |
0 / 0 |