.NET 4.5 Metro Application DependencyProperty - PullRequest
2 голосов
/ 28 сентября 2011

Я не могу заставить DependencyProperty.Register работать.

Требуется (string, string, string, PropertyMetadata) вместо string, Type, Type, UIPropertyMeatdata) ...

Я изменил часть UI-PropertyMetadata, но не могу заставить работать его строковую часть.Я пробовал typeof(T).ToString() и просто "T", но это не работает.

Мой код выглядит следующим образом

public ObservableCollection<RingSegment> RingSegments {
    get { return (ObservableCollection<RingSegment>)GetValue(RingSegmentsProperty); }
    set { SetValue(RingSegmentsProperty, value); }
}
public static readonly DependencyProperty RingSegmentsProperty = DependencyProperty.Register(
    "RingSegments", typeof(ObservableCollection<RingSegment>), typeof(MainPage), new PropertyMetadata(new ObservableCollection<RingSegment>()));

И ошибки, которые я получаю

Error 1 The best overloaded method match for 'Windows.UI.Xaml.DependencyProperty.Register(string, string, string, Windows.UI.Xaml.PropertyMetadata)' has some invalid arguments C:\Users\aleksandar.toplek\documents\visual studio 11\Projects\Project - XX\XX\MainPage.xaml.cs 21 68 XX

Error 2 Argument 2: cannot convert from 'System.Type' to 'string' C:\Users\aleksandar.toplek\documents\visual studio 11\Projects\Project - XX\XX\MainPage.xaml.cs 22 20 XX

Error 3 Argument 3: cannot convert from 'System.Type' to 'string' C:\Users\aleksandar.toplek\documents\visual studio 11\Projects\Project - XX\XX\MainPage.xaml.cs 22 63 XX

- РЕДАКТИРОВАТЬ -

Когда я это делаю

public static readonly DependencyProperty RingSegmentsProperty = DependencyProperty.Register(
    "RingSegments", "ObservableCollection<RingSegment>", "MainPage", new PropertyMetadata(new ObservableCollection<RingSegment>()));

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

A first chance exception of type 'System.TypeInitializationException' occurred in mscorlib.dll

в файле XamplTypeIngo.g.cs

System.TypeInitializationException was unhandled by user code
  Message=The type initializer for 'XX.MainPage' threw an exception.
  Source=mscorlib
  TypeName=XX.MainPage
  StackTrace:
       at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type)
       at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type)
       at Disk_Visualizer.XamlTypeInfo.XamlUserType.RunInitializer() in c:\Users\aleksandar.toplek\Documents\Visual Studio 11\Projects\Project - XX\XX\obj\Debug\XamlTypeInfo.g.cs:line 277
  InnerException: System.NullReferenceException
       Message=Object reference not set to an instance of an object.
       Source=Windows.UI.Xaml
       StackTrace:
            at Windows.UI.Xaml.DependencyProperty.Register(String name, String propertyTypeName, String ownerTypeName, PropertyMetadata typeMetadata)
            at Disk_Visualizer.MainPage..cctor() in c:\Users\aleksandar.toplek\Documents\Visual Studio 11\Projects\Project - XX\XX\MainPage.xaml.cs:line 21
       InnerException:  
...

Ответы [ 5 ]

4 голосов
/ 19 октября 2011

вы можете найти решение этой проблемы на

Зависимость Объявление свойства MSDN ссылка

1 голос
/ 04 октября 2011

OK. Наблюдая немного больше, я заметил, как заметил Александр Топлек, что это код XamlTypeInfo.g.cs, отвечающий за создание экземпляров типов. Он использует метод IXamlType CreateXamlType для ОБОИХ определенных типов XAML и обнаружения определенных свойств зависимости. Я заметил это, когда я изменил тип SelectedUser DP с User на string. Я также заметил один из моих преобразователей в этой реализации коммутатора. Я понял, что это поднял, когда я объявил об этом в моих ресурсах.

Итак, я экспериментировал:

Я сослался на пространство имен на свой пользовательский класс:

xmlns:model="using:AccountManagement.Model"

Я добавил образец модели, чтобы «зарегистрировать» этот тип в реализации XamlTypeInfo.g.cs:

<!--Sample Model-->
<model:User x:Key="sampleUser"/>

// Generates the following case in CreateXamlType 
case "AccountManagement.Model.User":
   userType = new XamlUserType(this, typeName, typeof(AccountManagement.Model.User), GetXamlTypeByName("Windows.Foundation.Object"));
   userType.Activator = Activate_1_User;
   xamlType = userType;
   break;

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

public static readonly DependencyProperty SelectedUserProperty =
        DependencyProperty.Register("SelectedUser", typeof(User).FullName, typeof(UsersView).FullName,
        new PropertyMetadata(null, OnSelectedUserChanged));

Я установил свои привязки:

<GridView 
   ... 
   SelectedItem="{Binding SelectedUser, ElementName=root}"
/>
<!--root being my UserControl (x:Name="root")-->

Но это не вызывало CallBack. :(. В конце концов я получил его с помощью обработчика, который назначает dp, и при этом назначении он вызывает обратный вызов. Это подтверждает, что DP был правильно зарегистрирован с правильным типом.

Моя задача - заставить привязку работать так, как я ожидаю.

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

Андрес Оливарес

0 голосов
/ 19 февраля 2012

Передача "Object" как propertyTypeName помогла в моем случае

public static readonly DependencyProperty MyProperty = DependencyProperty.Register("My", "Object", typeof(MyControl).FullName, new PropertyMetadata(null));
0 голосов
/ 04 октября 2011

У меня также возникают проблемы с объявлением свойства зависимостей для UserControl. Пробовал это:

public static readonly DependencyProperty SelectedUserProperty =
DependencyProperty.Register("SelectedUser", typeof(User).FullName, typeof(UsersView).FullName,
        new PropertyMetadata(default(User), OnSelectedUserChanged));

Где User - это пользовательский класс, а UsersView - это UserControl, но все равно появляется следующая ошибка:

Первое случайное исключение типа System.NullReferenceException произошло в accountreader.exe

Дополнительная информация: ссылка на объект не установлена ​​для экземпляра объекта.

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

Андрес Оливарес

0 голосов
/ 30 сентября 2011

У нас нет поддержки объявления свойства Custom Type в WinRT C #.Но вы можете попробовать этот обходной путь.

Это может решить проблему.

public static readonly DependencyProperty RingSegmentsProperty = DependencyProperty.Register(
    "RingSegments", "ObservableCollection<"Object>", "MainPage", new PropertyMetadata(new ObservableCollection<"Object>())
...