В WPF Designer есть ошибка при разборе общего элемента управления с переопределенным свойством - PullRequest
3 голосов
/ 18 декабря 2008

Я создал общий элемент управления без внешнего вида с виртуальным свойством:

public abstract class TestControlBase<TValue> : Control
{
    public static readonly DependencyProperty ValueProperty;

    static TestControlBase()
    {
        ValueProperty = DependencyProperty.Register("Value", typeof(TValue),
                                                    typeof(TestControlBase<TValue>));
    }

    protected TestControlBase()
    {
        Focusable = false;
        Value = default(TValue);
    }

    public virtual TValue Value
    {
        get
        {
            return (TValue)GetValue(ValueProperty);
        }
        set
        {
            SetValue(ValueProperty, value);
        }
    }
}

Затем я создал элемент управления, полученный из него, и переопределил свойство Value:

public class TestControl : TestControlBase<int>
{
    public override int Value
    {
        get
        {
            return base.Value;
        }
        set
        {
            base.Value = value;
        }
    }
}

Так что я использую его в Window XAML:

    <TestControls:TestControl />

Когда я открываю окно в конструкторе, все в порядке, но когда я помещаю курсор мыши в эту строку или в элемент управления в конструкторе, я получаю исключение:

Exception has been thrown by the target of an invocation.
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)


Ambiguous match found.
   at System.RuntimeType.GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
   at System.Type.GetProperty(String name)
   at MS.Internal.ComponentModel.DependencyPropertyKind.get_IsDirect()
   at MS.Internal.ComponentModel.DependencyPropertyKind.get_IsAttached()
   at MS.Internal.ComponentModel.APCustomTypeDescriptor.GetProperties(Attribute[] attributes)
   at MS.Internal.ComponentModel.APCustomTypeDescriptor.GetProperties()
   at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultExtendedTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetProperties()
   at System.ComponentModel.TypeDescriptor.GetPropertiesImpl(Object component, Attribute[] attributes, Boolean noCustomTypeDesc, Boolean noAttributes)
   at System.ComponentModel.TypeDescriptor.GetProperties(Object component)
   at MS.Internal.Model.ModelPropertyCollectionImpl.GetProperties(String propertyNameHint)
   at MS.Internal.Model.ModelPropertyCollectionImpl.<GetEnumerator>d__0.MoveNext()
   at MS.Internal.Designer.PropertyEditing.Model.ModelPropertyMerger.<GetFirstProperties>d__0.MoveNext()
   at MS.Internal.Designer.PropertyEditing.PropertyInspector.UpdateCategories(Selection selection)
   at MS.Internal.Designer.PropertyEditing.PropertyInspector.OnSelectionChangedIdle()

Кто знает эту проблему? Пожалуйста, объясните :) У меня нет идей, кроме того, что WPF Designer не любит дженерики. Если я заменю генерики на Object, то все в порядке.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2009

Иван

Возможно, ответ вам немного запоздал, но другие тоже могут его использовать. У меня была та же проблема, и я очень разочаровался, когда прочитал, что это ошибка. Но после некоторого гугла я нашел блог , который показывает способ использования этого вида наследования Кажется, что проблема решена, включая некоторые свойства в xaml. Надеюсь, это поможет.

1 голос
/ 26 апреля 2010

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

1 голос
/ 23 декабря 2008

Я думаю, что вы ничего не можете сделать. Это просто ошибка. То же самое происходит при разработке элементов управления WF.

Мой коллега по работе, который разрабатывает элементы управления Windows Form, создает второй элемент управления, который не является общим. Это просто обходной путь, но он работает. Если вы хотите работать в конструкторе, просто прокомментируйте generic (<>), после того, как ваша работа будет завершена, раскомментируйте ее.

Надеюсь, это поможет вам:)

...