WPF Binding к нескольким источникам данных
От: LittleBill  
Дата: 14.12.11 16:16
Оценка:
Есть три одинаковых контрола расположенных горизонтально и по порядку внутри четвертого (линейки), которые могут перемещаться внутри него.
выглядит это примерно так:
[1]_[2]_[3]
Задача стоит в том чтобы ограничить область перемещения каждого из трех контролов положениями остальных. Т.е. самый левый контрол [1] не сможет двигаться в право дальше левого края ближайшего правого контрола [2], самый правый контрол [3] не может двигаться левее чем правый край ближайшего левого контрола [2], ну а перемещения среднего [2] ограничены ближайшим левым [1] и правым [2].

Первое что пришло в голову, это решить данный вопрос с помощью DataBinding-а. Т.е. у каждого контрола есть свойства Left и Right которые определяют текущую координату относительно левого и правого краев контрола отночительно левого и правого краев линейки (принцип как у Canvas) но помимо них есть ещё и свойство-зависимость MinLeft которое, при добавлении каждого нового контрола в линейку связываются правой точкой ближайшего левого контрола, и свойство-зависимость MaxRight которое связывается с левой точкой ближайшего правого контрола... В свою очередь сами свойства Left и Right становятся связанными с свойствами MaxRight ближайшего левого и MinLeft ближайшего правого контролов соответственно.

В общем у меня два:
1. Можно ли в WPF указать для каждого свойства свой DataContext а не общий контекст для всего контрола?
2. Может быть у кого-то есть более изящная идея по решению вышеописанной задачи?
wpf binding usercontrol
Re: WPF Binding к нескольким источникам данных
От: MxMsk Португалия  
Дата: 15.12.11 09:51
Оценка: 3 (1)
Здравствуйте, LittleBill, Вы писали:

LB>В общем у меня два:

LB>1. Можно ли в WPF указать для каждого свойства свой DataContext а не общий контекст для всего контрола?
В классе Binding есть свойства Source, RelativeSource и ElementName. Каждое из них может использоваться, как источник данных, не зависимо от DataContext. Правильнее даже считать, что DataContext есть источник данных по умолчанию, когда ни одно из вышеперечисленных свойств не задано.

LB>2. Может быть у кого-то есть более изящная идея по решению вышеописанной задачи?

Так просто не скажешь. Для чего ограничивается область перемещения? Кто будет перемещать контролы? Можно ли программно проверить границы? Как вариант, рассмотреть Grid с тремя колонками, где средняя имеет Width=Auto, а контролы по краям выравниваются с HorizontalAlignment равными Left и Right соответственно стороне.
Re[2]: WPF Binding к нескольким источникам данных
От: LittleBill  
Дата: 15.12.11 14:46
Оценка:
Здравствуйте, MxMsk, Вы писали:

LB>>1. Можно ли в WPF указать для каждого свойства свой DataContext а не общий контекст для всего контрола?

MM>В классе Binding есть свойства Source, RelativeSource и ElementName. Каждое из них может использоваться, как источник данных, не зависимо от DataContext. Правильнее даже считать, что DataContext есть источник данных по умолчанию, когда ни одно из вышеперечисленных свойств не задано.

Ну ElementName думаю в моем случае не подойдет, а вот за идею с Source спасибо...

LB>>2. Может быть у кого-то есть более изящная идея по решению вышеописанной задачи?

MM>Так просто не скажешь. Для чего ограничивается область перемещения? Кто будет перемещать контролы? Можно ли программно проверить границы? Как вариант, рассмотреть Grid с тремя колонками, где средняя имеет Width=Auto, а контролы по краям выравниваются с HorizontalAlignment равными Left и Right соответственно стороне.

Не, Grid в моем случае не подойдет... Количество контролов у не конечное, перемещать их будет юзер мышкой, ограничения нужны чтоб контролы не залазили друг на друга, а либо не могли перетягиваться дальше границы ближайшего к ним левого или правого контролов, либо могли их "толкать" при столкновении... Но думаю что эту проблему я сам решу если с бандингом все получиться как планирую
Re: WPF Binding к нескольким источникам данных
От: DmitryMS  
Дата: 15.12.11 15:22
Оценка:
Да, байднинги можно, наваерное. Учитет, что они асинхронны по умолчанию.

А задачка типа интересная, я бы сделал так — каждый из ползунков живет в своей ячейке DataGrid'a.

Потом — делаем бехевьор на Грид, который устанвливает секацию для ColumnDefinition's (будет легче упрявлять ресайзом и все такое, поверьте).

определяем секацию так: <Grid local.Sectioner.Section="10,20,90">

при передвижении ползунков через мультибайндинг меняем свойство local.Sectioner.Section.
Re[2]: WPF Binding к нескольким источникам данных
От: LittleBill  
Дата: 15.12.11 15:59
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>Да, байднинги можно, наваерное. Учитет, что они асинхронны по умолчанию.


DMS>А задачка типа интересная, я бы сделал так — каждый из ползунков живет в своей ячейке DataGrid'a.


DMS>Потом — делаем бехевьор на Грид, который устанвливает секацию для ColumnDefinition's (будет легче упрявлять ресайзом и все такое, поверьте).


DMS>определяем секацию так: <Grid local.Sectioner.Section="10,20,90">


DMS>при передвижении ползунков через мультибайндинг меняем свойство local.Sectioner.Section.



Я похожее когда-то делал с Grid-ом, но в моем случае все несколько усложняется потому что контролы будут перетягиваться в рабочее пространство Drag and Drop-ом т.е. контрол может быть добавлен как с краю так и например между двумя контролами... Если использовать грид то придется создавать новый столбец и переназначать для остальных контролов их текущие столбцы что на мой взгляд не очень хорошо...
Re[3]: WPF Binding к нескольким источникам данных
От: Аноним  
Дата: 15.12.11 16:23
Оценка:
да, придется. но грид решит проблему наезда одного движка на другой. да и усложение минимальное, вам же все равно придется обрабатывать добавление новый движков.
Re[4]: WPF Binding к нескольким источникам данных
От: LittleBill  
Дата: 15.12.11 18:40
Оценка:
Здравствуйте, Аноним, Вы писали:


А>да, придется. но грид решит проблему наезда одного движка на другой. да и усложение минимальное, вам же все равно придется обрабатывать добавление новый движков.


Кстати а возможно мою задачу реализовать используя Thumb? перемещать он контрол умеет, а вот как сделать так чтобы два соседних контрола "погруженные" в Thumb-ы не накладывались друг на друга например?
Re[5]: WPF Binding к нескольким источникам данных
От: Аноним  
Дата: 16.12.11 09:25
Оценка:
А никак, двигать то вы будете эти тумбы все равно.
Re: WPF Binding к нескольким источникам данных
От: LittleBill  
Дата: 19.12.11 18:20
Оценка:
В общем решил я вопрос с взаимодействием между контролами при перемещении, правда отказался все таки от бандинга, да и гриды не применял... Просто "познакомил" крайние контролы друг с другом на уровне линейки ну а дальше набросал за час небольшой, но учитывающий все необходим варианты взаимодействия, рекурсивный алгоритм разруливающий столкновения и в итоге все отлично работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.