Пользовательский контроль WPF: DependencyProperty никогда не устанавливается (только на 1 из многих свойств)
Я создал пользовательский элемент управления под названием Форму, который наследуется от Control. Элемент управления используется для отображения полей объекта IAddress.
Первоначально я сделал этот элемент управления в Silverlight, теперь я пытаюсь заставить его работать в WPF .net 4.5
Элемент управления определяет 9 различных свойств зависимостей, и все, кроме одного, работают правильно. Естественно, тот, который не работает-это сам объект адреса!
Свойство адреса элемента управления никогда получает значение. я поставил точку останова в геттере адреса, свойство вызывается, объект адреса не является нулевым, но элемент управления не получает его.
На экране вывода нет ни исключений, ни сообщений об ошибках.
Управление:
public class AddressForm : Control, INotifyPropertyChanged
{
[...]
public static readonly DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata( AddressChanged));
public IAddress Address
{
get { return (IAddress)GetValue(AddressProperty); }
set { SetValue(AddressProperty, value); }
}
private static void AddressChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//break-point here never gets hit
AddressForm form = d as AddressForm;
if (form != null)
form.OnAddressSet();
}
private void OnAddressSet()
{
//break-point here never gets hit
if (StateProvince != null && Address != null)
SelectedStateProvince = StateProvince.Where(A => A.StateProvince == Address.StateProvince).FirstOrDefault();
}
[...]
}
(другие свойства DependencyProperties установлены таким же образом и работают правильно.)
Xaml:
<Address:AddressForm Address="{Binding SelectedMFG.dms_Address, Mode=TwoWay}" ... />
Тип SelectedMFG-scm_MFG
Данные объекты:
public partial class scm_MFG
{
[...]
public virtual dms_Address dms_Address { get; set; } //break-point here never enables? Generated code from Entity TT
//Another attempt, trying to determine if the IAddress cast was the cause of the issue
//Address="{Binding SelectedMFG.OtherAddress}"
public IAddress OtherAddress
{
get {
return dms_Address as IAddress; //break-point here gets hit. dms_Address is not null. Control never receives the value.
}
}
}
public partial class dms_Address : IAddress, INotifyPropertyChanged { ... }
Мои Попытки:
Я пытался получить доступ к свойству dms_Address разными способами. Я могу отобразить значения адреса в текстовом поле, что говорит мне, что нет никаких проблем с datacontext.
<TextBox Text="{Binding SelectedMFG.dms_Address.StreetName, Mode=TwoWay}" /> <!-- this value displays -->
Я также попытался изменить метаданные регистрации свойства зависимостей. Я не уверен, что правильно использовать: PropertyMetadata, UIPropertyMetadata или FrameworkPropertyMetadata
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata(AddressChanged));
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata(null, AddressChanged));
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new UIPropertyMetadata(AddressChanged));
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, AddressChanged));
// and other FrameworkPropertyMetadataOptions, no difference
.
Я верю, что я все сделал правильно и что это должно работать.
Что-нибудь выскакивает как странное или неправильное?
1 ответ:
Я нашел решение.
Я изменил свойство зависимости адреса в форме с IAddress на Object. Теперь свойство настраивается. Кажется, что, хотя я был возвратить IAddress, объект, который по форме действительно получает это EntityWrapper для dms_Address.
Эта оболочка сущности также будет приводить к IAddress, поэтому я не уверен, почему она вела себя так. Просто еще одна сущность попалась, я думаю.