Привязка к полю независимого объекта - PullRequest
0 голосов
/ 14 февраля 2012

В моем проекте .NET 4.0 у меня есть объект, который имеет открытые поля, и этот объект не реализует INotifyPropertyChanged и не наследует DependencyObject, и этого никогда не произойдет.Однако мне нужен механизм для «привязки» к полям этого объекта в моем элементе управления WPF.Я знаю, что не могу сделать это напрямую, поскольку привязка требует свойства зависимости (или, по крайней мере, свойств и уведомления об изменениях свойств), так что я могу сделать для реализации необходимой мне функции привязки.Я пытался что-то вроде этого в моем элементе управления WPF:

    void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public float Friction
    {
        get
        {
            if (CurrentObject != null)
            {
                return CurrentObject.Friction;
            }
            else
            {
                return 0.0f;
            }
        }
        set
        {
            if (CurrentObject != null)
            {
                CurrentObject.Friction = value;
                FirePropertyChanged("Friction");
            }
        }
    }

    public PlatformObjectTemplate CurrentObject
    {
        get
        {
            return GetValue(CurrentObjectProperty) as PlatformObjectTemplate;
        }
        set
        {
            SetValue(CurrentObjectProperty, value);
            FirePropertyChanged("Friction");
            FirePropertyChanged("CurrentObject");
            BindShapes();
            IntersectionComboBox.SelectedItem = CurrentObject.IntersectionStaticMethod;
        }
    }

    public static readonly DependencyProperty CurrentObjectProperty = DependencyProperty.Register("CurrentObject", typeof(PlatformObjectTemplate), typeof(PlatformStaticObjectPropertyEditor), new PropertyMetadata(null));

Мой элемент управления WPF реализует INotifyPropertyChanged, а мой PlatformObjectTemplate не имеет свойств, только открытые поля, такие как Friction.Мне нужно привязать свой объект в XAML следующим образом:

(в моем контроле): // DoubleUpDown из инструментария WPF.

<tk:DoubleUpDown Margin="91,10,7,0" Name="doubleUpDown1" VerticalAlignment="Top" Value="{Binding Friction, ElementName=window, FallbackValue=0}" />

(в моем главном окне):

<my:PlatformStaticObjectPropertyEditor x:Name="platformStaticObjectPropertyEditor1" CurrentObject="{Binding CurrentObject, ElementName=window}" />

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

Хорошо, вот два требования:

PlatformObjectTemplate будет не использовать свойства.У него будут публичные поля.Мне нужен декларативный способ связывания, как обычно, так же, как я использовал в XAML выше.

У меня, вероятно, есть слишком сложные вещи, и я, должно быть, упускаю некоторые вещи.Каков наиболее «правильный» и «декларативный» способ сделать это правильно в рамках моих требований чуть выше?

Спасибо, можно.

1 Ответ

1 голос
/ 15 февраля 2012

object neither implements INotifyPropertyChanged nor inherits DependencyObject, and it will never. However, I need a mechanism to "bind" to fields of this object in my WPF control

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

...