powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataBinding без извращений
11 сообщений из 11, страница 1 из 1
DataBinding без извращений
    #37920574
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый. Задумался, как без извращений сделать DataBinding Между DataGrid-ами и DataSet-ом, генерированном с помощью XSD?

DataSet coreDataBase я получаю из веб-сервиса:
Код: c#
1.
2.
3.
4.
            this.coreDataBase = this.proxy.GetModules();
            this.Resources["coreDataBase"] = this.coreDataBase;
            InitializeComponent();
            set_events();



В форме приводится следующий биндинг:
Код: c#
1.
2.
3.
4.
5.
    <UserControl.Resources>
        <CollectionViewSource x:Key="modulesViewSource" Source="{Binding Path=Modules, Source={StaticResource coreDataBase}}" />
        <CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />
        <CollectionViewSource x:Key="modulesInterfaceGroupsReportsViewSource" Source="{Binding Path=FK_Reports_InterfaceGroups, Source={StaticResource modulesInterfaceGroupsViewSource}}" />
    </UserControl.Resources>


Далее гриды крепятся к ресурсам:
Код: c#
1.
<my:ExtendedDataGrid ItemsSource="{Binding Source={StaticResource modulesInterfaceGroupsViewSource}}"/>



А вот затем начинаются танцы с бубном:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        private void set_events()
        {
            this.coreDataBase.Modules.RowChanged += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
            this.coreDataBase.Modules.RowDeleted += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
            this.coreDataBase.InterfaceGroups.RowChanged += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
            this.coreDataBase.InterfaceGroups.RowDeleted += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
            this.coreDataBase.Reports.RowChanged += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
            this.coreDataBase.Reports.RowDeleted += new System.Data.DataRowChangeEventHandler(Modules_RowChanged);
        }

        private void Modules_RowChanged(object sender, System.Data.DataRowChangeEventArgs e)
        {
            this.proxy.UpdateModules(this.coreDataBase);
            this.coreDataBase = proxy.GetModulesUpdated(this.coreDataBase);
            this.modulesExtendedDataGrid.ItemsSource = coreDataBase.Modules;// тут извращение по первому вопросу
            this.fK_InterfaceGroups_ModulesExtendedDataGrid.ItemsSource = coreDataBase.InterfaceGroups; // тут даже с бубном - затык ибо всякие связи таблиц слетают. Отсюда вопрос №2
            this.fK_Reports_InterfaceGroupsExtendedDataGrid.ItemsSource = coreDataBase.Reports; // тут тоже
            set_events(); // Естественно привязка слетает. Приходится перевешивать события.
        }



Вопроса 2:
1. Как реализовать изменение ItemsSource у DataGrid без его переопределения (только ObservableCollection?);
2. Если все же без этого не обойтись, то как при минимуме телодвижений сохранить связь отображаемых таблиц?

Спасибо.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37920598
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.style1. Как реализовать изменение ItemsSource у DataGrid без его переопределения (только ObservableCollection?);
Код: c#
1.
2.
ItemsSource = null
ItemsSource = newData;


ЗЫ. Лучше ObservableCollection.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37920746
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если через ObservableCollection, то мне нужно свой адаптер писать, а суть в том, чтобы использовать стандартный, ведь отчетов будет воз и маленькая тележка!
Этот еще очень простенький.

Если абстрагироваться от данного примера, то при перезагрузке значений DataSet все привязки летят к Ебени матери.
Отсюда необходимость первого костыля. Ну хрен бы с ним. Кода немного и он прост как варежка.
Но все же затык со второй проблемой с полпинка мне решить так и не удалось.

Как задать this.fK_InterfaceGroups_ModulesExtendedDataGrid.ItemsSource = Relation ??? Может кто знает? Стандартная ведь тема должна быть. А гугл молчит.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37920957
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуток перефразирую. Как подобный код в XAML:
Код: c#
1.
2.
3.
<CollectionViewSource x:Key="modulesViewSource" Source="{Binding Path=Modules, Source={StaticResource coreDataBase}}" />
<CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />
<CollectionViewSource x:Key="modulesInterfaceGroupsReportsViewSource" Source="{Binding Path=FK_Reports_InterfaceGroups, Source={StaticResource modulesInterfaceGroupsViewSource}}" />


написать на C#?
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37921013
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.styleЧуток перефразирую. Как подобный код в XAML:
Код: c#
1.
2.
3.
<CollectionViewSource x:Key="modulesViewSource" Source="{Binding Path=Modules, Source={StaticResource coreDataBase}}" />
<CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />
<CollectionViewSource x:Key="modulesInterfaceGroupsReportsViewSource" Source="{Binding Path=FK_Reports_InterfaceGroups, Source={StaticResource modulesInterfaceGroupsViewSource}}" />


написать на C#? Тут
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37921080
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,
воот, спасибо! Полезная ссылка.
Теперь пришел к виду:
this.Resources["modulesViewSource"] = CollectionViewSource.GetDefaultView(this.coreDataBase.Modules);
Что скорее всего равносильно:
<CollectionViewSource x:Key="modulesViewSource" Source="{Binding Path=Modules, Source={StaticResource coreDataBase}}" />

Но это полдела. Меня вводит в недоумение следующее:
<CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />

Тут мы биндимся к предыдущей коллекции modulesViewSource и каким-то образом находим ее связь с внешним ключом по мистическому адресу FK_InterfaceGroups_Modules. Уличная магия, чесслово.
Вопрос открыт.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37921284
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex.styleНо это полдела. Меня вводит в недоумение следующее:
<CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />

Тут мы биндимся к предыдущей коллекции modulesViewSource и каким-то образом находим ее связь с внешним ключом по мистическому адресу FK_InterfaceGroups_Modules. Уличная магия, чесслово.
Вопрос открыт.Эти чудеса описаны в мануалах по DataSet, если я правильно понял вопрос. :-)
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37921396
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

К сожалению, в доках ничего по этому поводу нет. В примерах видел только как задается подобный параметр в XAML.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37921403
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую через ChildRelations, привязка все равно не сохраняется:

Код: c#
1.
2.
3.
             this.modulesExtendedDataGrid.ItemsSource =  CollectionViewSource.GetDefaultView(this.coreDataBase.Modules);
                this.fK_InterfaceGroups_ModulesExtendedDataGrid.ItemsSource =  CollectionViewSource.GetDefaultView(this.coreDataBase.Modules.ChildRelations["FK_InterfaceGroups_Modules"].ChildTable);
                this.fK_Reports_InterfaceGroupsExtendedDataGrid.ItemsSource = CollectionViewSource.GetDefaultView(this.coreDataBase.Modules.ChildRelations["FK_InterfaceGroups_Modules"].ChildTable.ChildRelations["FK_Reports_InterfaceGroups"].ChildTable);
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37922252
Old_Fat_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hex.styleТут мы биндимся к предыдущей коллекции modulesViewSource и каким-то образом находим ее связь с внешним ключом по мистическому адресу FK_InterfaceGroups_Modules. Уличная магия, чесслово.1/ Если DataGrid с Master таблицей мышью кидаешь на окно с параметром "генерировать колонки по умолчанию", то кроме всех полей будет (одна или несколько) колонок с foreign key. Значит DataSet знает об этом, значит магии нет.

2/ Чем не устраивает Master-Detail сценарий, генерируемый студией по умолчанию для DataSet?

3/ Вообще не понял в чём суть проблемы. Что не работает? На всякий случай, если надо иметь доступ к ресурсам и из XAML для байндинга и из кода для хороших дел, то:
- объявляю их в XAML
(типа <CollectionViewSource x:Key="modulesInterfaceGroupsReportsViewSource"/>
создаст пустую коллекцию как new CollectionViewSource(); )
- в коде цепляю через ссылку, как в примере (пункт 2) через FindResourse
- сами значения ресурса, если не прибайндены в XAML, тогда заливаются в коллекцию в коде.
...
Рейтинг: 0 / 0
DataBinding без извращений
    #37923577
hex.style
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Old_Fat_CatЗначит DataSet знает об этом
Тут никто не спорит, более того, эти привязки даже можно увидеть в самой структуре.
Old_Fat_Catзначит магии нет.
Имею ввиду "магию" XAML. Попробуй, к примеру, записать через код вот это:
Код: c#
1.
<CollectionViewSource x:Key="modulesInterfaceGroupsViewSource" Source="{Binding Path=FK_InterfaceGroups_Modules, Source={StaticResource modulesViewSource}}" />



Old_Fat_Cat2/ Чем не устраивает Master-Detail сценарий, генерируемый студией по умолчанию для DataSet?
Да полностью устраивает! Более того, я именно его и хочу использовать. Как видно из кода, я изначально гружу DataSet, у меня переход по существующему DataSet работает отличненько! Однако при попытке подгрузить данные в существующий DataSet я сталкиваюсь с тем, что слетают байдинги в XAML и у меня не получается их восстановить.

Old_Fat_Cat- объявляю их в XAML
(типа <CollectionViewSource x:Key="modulesInterfaceGroupsReportsViewSource"/>
создаст пустую коллекцию как new CollectionViewSource(); )
- в коде цепляю через ссылку, как в примере (пункт 2) через FindResourse
В общем, как и я.

Old_Fat_Cat- сами значения ресурса, если не прибайндены в XAML, тогда заливаются в коллекцию в коде.
Значения прибайндены. Но если ты мне покажешь на моем примере, как этот пункт реализовать без великих танцев с бубном и губной гармошкой и чтобы при этом не слетали байндинги, буду тысячу раз тебе благодарен. Если реально поможешь, с меня пиво!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataBinding без извращений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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