Привязка данных к свойству CLR в коде

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

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

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

Ответы на вопрос(5)

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

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

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

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.)

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 собственность, измененная непосредственно по любой причине, состояние этого суррогата больше не будет соответствовать. Тем не менее, это может не иметь значения для ваших целей.

вы можете привязать свойство 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 соответственно) и привязка, используемая для получения в источнике.

НТН

Тони

ебование для работы с данными!

Узнайте больше здесь:

http://msdn.microsoft.com/en-us/library/ms531387(VS.85).aspxhttp://msdn.microsoft.com/en-us/library/ms752347.aspx

Ваш ответ на вопрос