Привязка данных к свойству CLR в коде - PullRequest
8 голосов
/ 07 октября 2010

Привязка к свойству зависимости легко выполняется в коде.Вы просто создаете новый объект System.Windows.Data.Binding, а затем вызываете метод SetBinding целевого объекта зависимости.

Но как это сделать, когда свойство, которое мы связываем, является свойством CLR, и вы можете '• предоставить DependencyProperty аргумент SetBinding?

РЕДАКТИРОВАТЬ: Объект реализует INotifyPropertyChanged, если это уместно.

Ответы [ 5 ]

4 голосов
/ 07 октября 2010

Цели привязки ДОЛЖНЫ быть свойствами зависимостей!Это единственное требование для привязки данных для работы!

Подробнее здесь:

1 голос
/ 20 мая 2018

Для того, чтобы это было возможно, свойство должно быть тем, для которого вы пишете установщик (таким образом, не свойство, определенное в коде, которое вы не можете изменить).
Тогда решение будет Реализация изменения свойстваУведомление .

Пример кода по вышеуказанной ссылке:

using System.ComponentModel;

namespace SDKSample
{
  // This class implements INotifyPropertyChanged
  // to support one-way and two-way bindings
  // (such that the UI element updates when the source
  // has been changed dynamically)
  public class Person : INotifyPropertyChanged
  {
      private string name;
      // Declare the event
      public event PropertyChangedEventHandler PropertyChanged;

      public Person()
      {
      }

      public Person(string value)
      {
          this.name = value;
      }

      public string PersonName
      {
          get { return name; }
          set
          {
              name = value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("PersonName");
          }
      }

      // Create the OnPropertyChanged method to raise the event
      protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
  }
}

В этой реализации каждый установщик свойства должен вызывать

OnPropertyChanged("YourPropertyName");

Или длянемного другая реализация, которая позволяет избежать повторного ввода имени свойства в качестве строкового параметра, см. мой ответ здесь .
Там я также упоминаю Fody / PropertyChanged, TinyMvvm и MvvmCross как библиотеки,помогите реализовать этот шаблон.
(я работаю в Xamarin Forms, но я думаю, что все они также применимы из WPF; они основаны на пространстве имен System.ComponentModel.)

0 голосов
/ 20 января 2012

Например, вы можете привязать свойство CLR к DepenencyProperty в элементе управления.В этом случае свойство CLR является ИСТОЧНИКОМ привязки, а свойство DependencyProperty является ЦЕЛЕМ привязки.Чтобы это работало, класс со свойством CLR должен реализовать INotifyPropertyChanged.

Вот как это делается в следующем коде:

Binding canModifyBinding = new Binding();
canModifyBinding.Source = LastRecord;
canModifyBinding.Path = new PropertyPath( "CanModify" );
BindingOperations.SetBinding( this, CanModifyProperty, canModifyBinding );

В этом случае объект Binding представляетинформация об источнике: какой объект является источником, какое свойство этого объекта является интересующим вас. BindingOperations.SetBinding - это статический метод, который определяет, какой DependencyProperty для какого DependencyObject является целью привязки (аргументы 2 и 1соответственно) и Binding для использования в источнике.

HTH

Tony

0 голосов
/ 07 октября 2010

Подождите.Вы пытаетесь связать 2 свойства CLR ??Позвольте мне сказать, что такой вещи невозможно достичь обычным способом.например.никакой хардкорный хак, который может сделать ваше приложение нестабильным.Одной из сторон привязки ДОЛЖНА быть DependencyProperty.Период.

0 голосов
/ 07 октября 2010

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

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

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

public static StatusDisplaySurrogates
{
    public static string GetMessage(StatusDisplay element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }
        return element.GetValue(MessageProperty) as string;
    }

    public static void SetMessage(StatusDisplay element, string value)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }
        element.SetValue(MessageProperty, value);
    }

    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.RegisterAttached(
            "Message",
            typeof(string),
            typeof(StatusDisplay),
            new PropertyMetadata(null, OnMessagePropertyChanged));

    private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        StatusDisplay source = d as StatusDisplay;
        source.Message = e.NewValue as String;
    }
}

Конечно, если элемент управления StatusDisplay имеет свойство Message, измененное напрямую по любой причине, состояние этого суррогата не будетдлиннее совпадение.Тем не менее, это может не иметь значения для ваших целей.

...