powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как получиться datacontext usercontrol?
16 сообщений из 16, страница 1 из 1
Как получиться datacontext usercontrol?
    #39083401
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток уважаемые знатоки! Вопрос возможно банальный, но никак не могу с ним разобраться.
И так: использую RadGridView от Telerik, привязал коллекцию - все работает. Затем решил добавить фильтр по столбцу - то есть пользователь вводит текст и в гриде строки фильтруются.
Как то так:
Код: xml
1.
2.
3.
<telerik:RadGridView ItemSource="{Binding ListTest}" ...>
<telerik:RadGridView.FilterDescriptors>
<telerik:FilterDescriptor IsCaseSensitive="False" Operator="Contains" Member="t1" Value="{Binding FilterValue}"...



FilterValue - это свойства типа string, куда записывается то, что ввел пользователь в textBox. Но как я понимаю, у грида другой datacontext, а как получиться ссылку на datacontext всего usercontrol? Через ElementName не работает(

Использую MVVM, для dataContext userControl используется отдельный класс. Устанавливается в другом классе))
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083474
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RelativeSource + AncestorType
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083532
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

использую Silverlight 4. Там, как я понимаю, нет этого
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083753
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте ICollectionView прямо в контексте модели.

Создайте на базе вашей коллекции ListCollectionView, либо используйте представление по умолчанию c помощью метода CollectionViewSource.GetDefaultView(object).

Затем свойство Filter для данного представления, свойство фильтр имеет тип Predicate<object>, можно в качестве параметра задать название метода с сигнатурой bool MethodName(object value).

свяжите ваш ItemsControl с коллекцией (если вы используйте View'у по умолчанию) или непосредственно с View'ой, если вы создаете свою.

Затем свяжите строку в которой осуществляете ввод текста для фильтрации со свойством в модели представления и каждый раз когда значение свойство изменяете вызывайте метод Refresh из интерфейса ICollectionView для вашего представления коллекции.

У меня есть подозрения, что этот Telerik контрол делает абсолютно тоже самое, нафига в контроле всё это барахло, мне честно говоря не очень понятно. Как по мне, фильтрация и прочее это лишнее, для этого существует CollectionView'хи
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083859
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osvaldvАлексей К,

использую Silverlight 4. Там, как я понимаю, нет этогоДа, в SL4 такого нет. Добавлено в SL5.
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083861
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КRelativeSource + AncestorType
такое не сработает RelativeSource + AncestorType это банальный поиск по логическому дереву. весь фокус в том, что FilterDescriptor вообще не находится в дереве, а является элементом списка свойства и не более.
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39083870
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesАлексей КRelativeSource + AncestorType
такое не сработает RelativeSource + AncestorType это банальный поиск по логическому дереву. весь фокус в том, что FilterDescriptor вообще не находится в дереве, а является элементом списка свойства и не более.При создании ячеек грида этот биндинг, вероятно, будет применён к какому-нибудь FrameworkElement, расположенному в визуальном дереве.
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39084258
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

спасибо за совет! Честно говоря не хотелось бы связываться с ICollectionView из за такой, казалось мелочи.
Есть FilterDescriptor на гриде, свойство Value которого надо привязать на textbox либо на свойство из модели представления..
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39084922
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osvaldvRoman Mejtes,

спасибо за совет! Честно говоря не хотелось бы связываться с ICollectionView из за такой, казалось мелочи.
Есть FilterDescriptor на гриде, свойство Value которого надо привязать на textbox либо на свойство из модели представления..
задайте x:Name для элемента и в CodeBehind сделанай Binding, либо через BindingProxy и статик ресурс, или через DataObjectProvider как вариант
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39086283
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

решил не изобретать велосипеды, а сделать как Вы и писали - через CollectionViewSource. Telerik кстати предлагает аналогичный механизм, но только через свои решения - это я нашел, полазив по форумам.

Спасибо большое за ответ!
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39086285
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так, может кому пригодится - ответ на мой вопрос, точнее одно из решений проблемы))) Суть описана выше.
Как сделал:
В модели представления объявил свойство CollectionViewSource viewSource. В конструкторе прописал:
Код: c#
1.
2.
3.
viewSource = new CollectionViewSource();
 viewSource.Source = Tests; // Tests - это ObservableCollection с данными
 viewSource.Filter += new FilterEventHandler(viewSource_Filter); // добавил фильтр



Сам фильтр:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void viewSource_Filter(object sender, FilterEventArgs e)
        {

            Test t = e.Item as Test;
            if (t != null)
            {                
                if (t.Pole2.IndexOf(Str) >= 0)
                {
                    e.Accepted = true;
                }
                else
                {
                    e.Accepted = false;
                }
            }
        }



Сам пример тестовый, поэтому корявые названия)
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39086434
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось правда два вопроса:
1. У меня коллекция обновляется по нажатию на кнопку, что то типа "Обновить данные" - viewSource при этом не обновляется. Почему это может быть? Ведь коллекция ObservableCollection? Она наследует интерфейс INotifyCollectionChanged.. Или viewSource.Source каждый раз при обновлении исходной коллекции надо переприсваивать?

2. Вопрос возможен банален и так и должно быть - в моем гриде, на SelectedItem забиндино свойство из модели представления. При запуске приложения оно сразу устанавливается на первую строку в гриде. Это особенность viewSource?
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39086913
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
экземпляр CollectionViewSource имеет смысл создавать тогда, когда вы используйте его через XAML, в C# в коде это только создает лишний геморой.
Проще всего сделать так:

Код: c#
1.
2.
3.
var list = new ObservableCollection<T>();
var view = new ListCollectionView(list);
view.Filter = OnFilter;



и привязать этот объект view к ItemsControl.ItemsSource через соответствующие свойства модели.

На счет текущего элемента. В представлении коллекции есть текущий элемент списка, если быть проще, то попробуйте сделать так:


Код: c#
1.
2.
3.
var list = new ObservableCollection<T>();
View1 = CollectionViewSource.GetDefaultView(list);
View2 = CollectionViewSource.GetDefaultView(list);


затем создайте 2 ListBox'а и свяжите ItemsSource обоих на View1 и View2 соответственно. Увидите, что текущий элемент выделения при переключении в 1ом, переключается и во 2ом контроле. Дело в том, что View1 и View2 это один и тот же экземпляр класса, следовательно и текущий элемент у них общий. чтоб этого не происходило нужно либо задать для ListBox'а свойство IsSynchronizedWithCurrentItem="False", либо просто создать 2е разные View'и через ListCollectionView.
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39087503
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

со вторым вопросом разобрался. Огромное спасибо.

Остался первый - пробую сделать как Вы писали, но споткнулся на ListCollectionView - не получается его создать. Ошибка - не доступен из за его уровня защиты (System.Windows.Data.ListCollectionView). Или я просто что то делаю не так..
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39087542
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osvaldvRoman Mejtes,

со вторым вопросом разобрался. Огромное спасибо.

Остался первый - пробую сделать как Вы писали, но споткнулся на ListCollectionView - не получается его создать. Ошибка - не доступен из за его уровня защиты (System.Windows.Data.ListCollectionView). Или я просто что то делаю не так..
пространство имён System.Windows.Data
не знаю, на сколько оно доступно в SL, в WPF оно Public.
проверьте может вы не тот конструктор вызываете
...
Рейтинг: 0 / 0
Как получиться datacontext usercontrol?
    #39088501
osvaldv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

проверил. Все правильно. В SL не доступен, а в WPF доступен (ради интереса создал тестовое wpf приложение). Вот они "приятные" неожиданности silverlight((

Вопрос обновление source у view решил простым присваиванием)) То есть когда пользователь запрашивает данные с сервера (через webclient в моем случае реализовано) то после того, как ObservableCollection получена она снова присваивается view.source.
Не знаю, правда, насколько этот подход неправильный...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как получиться datacontext usercontrol?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]