Пользовательский контроль 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 8

1 ответ:

Я нашел решение.

Я изменил свойство зависимости адреса в форме с IAddress на Object. Теперь свойство настраивается. Кажется, что, хотя я был возвратить IAddress, объект, который по форме действительно получает это EntityWrapper для dms_Address.

Эта оболочка сущности также будет приводить к IAddress, поэтому я не уверен, почему она вела себя так. Просто еще одна сущность попалась, я думаю.