привязка свойства к любому из двух свойств зависимостей

У меня есть два настраиваемых элемента управления, которые аналогичны узлу, и элемент управления, рисующий связи между узлами.

Я хотел бы, чтобы оба элемента управления были написаны как можно больше на xaml. Ссылка сохраняет оба узла как свойства зависимостей, и я использую привязку данных для перемещения линии между узлами всякий раз, когда узлы перемещаются.

Было бы здорово иметь возможность изменять какое-то другое значение линии, например ширину штриха, в зависимости от расстояния между двумя узлами. Таким образом, свойство должно обновляться при перемещении любого узла, и я не совсем понимаю, как это будет работать.

У кого-нибудь есть идеи?


person tenpn    schedule 20.09.2008    source источник


Ответы (2)


вы можете попробовать сделать что-то вроде этого:

  1. как и в предыдущем посте, определите свойство ширины, обводки (все, что вам нужно) в вашем классе ссылок.
  2. определите мультипривязку, применяемую к этому свойству, передав два узла привязке, которая должна выглядеть так:

‹Multibinding Converter="{StaticResource convert}"›
‹Binding Path="Node1" RelativeSource|Source.../›
‹Binding Path="Node2" ... /›
‹/Multibinding ›

  1. Реализуйте интерфейс IMultiValueConverter, который будет вычислять, как должна выглядеть обводка, исходя из расстояния между узлами.

  2. в xaml создайте экземпляр вашего конвертера и добавьте его в свойство Converter мультипривязки.

Преимущество этого решения в том, что у вас есть довольно четкая модель классов, и каждый класс выполняет простые задачи. более того, позже вы можете настроить свой класс преобразователя для поддержки дополнительных случаев, не касаясь класса узла, который остается простым и предназначен только для отображения узлов.

в общем, всякий раз, когда вам нужно сопоставить несколько значений свойств с одним другим свойством, вам придется использовать множественную привязку и конвертер.

person Greg    schedule 22.09.2008

Вы можете определить свойство StrokeWidth в своем классе ссылок, которое вычисляется каждый раз, когда узлы перемещаются, а затем привязать к нему соответствующее свойство стиля.

Я полагаю, вы также можете попробовать что-то сделать с DataTriggers, но для работы с ними нужны определенные значения — вы не можете использовать какие-либо выражения. Это затруднило бы хорошее масштабирование решения на широкий диапазон расстояний между узлами.

person 17 of 26    schedule 20.09.2008
comment
В настоящее время я использую свойство в коде программной части и привязываю к нему данные в xaml. Когда любой узел перемещается, они сообщают всем ссылкам об обновлении. Несмотря на отсутствие опыта работы с WPF, это просто не самое элегантное решение. - person tenpn; 21.09.2008