Как реализовать связанное поведение blend/wpf, которое ссылается на другой элемент управления как на свойство?

Я пытаюсь реализовать поведение, которое работает с объектом, но на которое влияет второй объект.

Например, он изменит внешний вид элемента каркаса в зависимости от расстояния до другого элемента каркаса.

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

 public class ChangeWithDistance : Behavior<FrameworkElement>

И где-то в поведении мне понадобится свойство зависимости, которое указывало бы на имя (?) другого элемента управления.

Какой класс я должен сделать своим свойством зависимости, чтобы это поведение указывало на другой элемент управления?

Могу ли я указать propdp как строку, представляющую имя другого элемента управления?

Или есть другой класс, который я должен использовать, который означает тег, связанный с элементом управления (вы знаете, что бизнес x: Name..)

Или propdp должен указывать на такой элемент фреймворка?

    public static readonly DependencyProperty OtherControl =     
          DependencyProperty.Register("OtherControl", typeof(FrameworkElement)

Или я что-то делаю с привязкой?

Есть ли наилучшая практика, как указать поведение или действительно что-либо, что имеет свойство зависимости в другом элементе управления?

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


person Jeremy White    schedule 29.09.2012    source источник


Ответы (2)


Мне повезло объявить мое свойство зависимостей как таковое:

 public static readonly DependencyProperty OtherObjectProperty =
        DependencyProperty.Register("OtherObject", typeof (FrameworkElement), typeof (MyBehavior), new UIPropertyMetadata());

А затем в XAML, привязывающем его к другому объекту, меня интересует следующее:

  <Rectangle ....>
       <Interactivity:Interaction.Behaviors>
             <Controls:MyBehavior OtherObject="{Binding ElementName=TheOtherElementNameIWantToReference}" />
       </Interactivity:Interaction.Behaviors>
  </Rectangle>                   
person Jeremy White    schedule 30.09.2012
comment
ChangeWithDistance : Behavior‹FrameworkElement› не реализует dependencyObject, поэтому вы получаете ошибку XAML. «Привязка» может быть установлена ​​только для свойства DependencyProperty объекта DependencyObject. - person rolls; 18.11.2016

Это много вопросов в одном. Ознакомьтесь с прикрепленными свойствами: http://msdn.microsoft.com/en-us/library/ms749011.aspx

Короткий ответ: вам нужно использовать метод RegisterAttached, а не Register.

person phoog    schedule 29.09.2012
comment
Я понимаю прикрепленные свойства (я думаю). У меня нет проблем с присоединением свойства к объекту A, моя проблема в том, что я хочу указать в XAML, что прикрепленное свойство (к A) также знает об объекте B. По имени? По струне? Передавая в привязке? Таким образом, мой вопрос просто в том, как вы ссылаетесь на другой объект, используя свойства - person Jeremy White; 30.09.2012
comment
@JeremyWhite Я подозреваю, что вы неправильно понимаете вложенные свойства. Присоединенное свойство специально предназначено для случаев, когда одному объекту необходимо знать о другом. Например, когда вы помещаете элемент управления в Grid, к нему добавляется свойство Grid.RowGrid.Column). Эти свойства недоступны в XAML, если элемент управления не содержится в сетке. Это похоже на ваш случай; на поведение элемента управления (первый объект) влияет сетка (второй объект). - person phoog; 01.10.2012
comment
@JeremyWhite также отмечает, что первые несколько страниц здесь используют прикрепленные свойства (и RegisterAttached): google.com/ q=attached+behavior Присоединенное свойство означает, что тип, определяющий присоединенное свойство (например, Grid), прикрепляет свойство к объекту другого типа (например, TextBlock). Тогда вам не нужно беспокоиться об именах элементов; подписи получателя и установщика прикрепленного свойства включают параметр, указывающий на объект, использующий присоединенное свойство. - person phoog; 01.10.2012
comment
Да, я знаю, как использовать AssociatedObject. Мне нужна ссылка/привязка к третьему объекту, а не только к основному объекту и прикрепленному объекту. - person Jeremy White; 01.10.2012