В моем проекте .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 выше.
У меня, вероятно, есть слишком сложные вещи, и я, должно быть, упускаю некоторые вещи.Каков наиболее «правильный» и «декларативный» способ сделать это правильно в рамках моих требований чуть выше?
Спасибо, можно.