Свойство пользовательского элемента управления F # Silverlight 3.0: - PullRequest
0 голосов
/ 18 мая 2010

Я определил элемент управления с:

 static member ItemsProperty : DependencyProperty = 
        DependencyProperty.Register(
            "Items",
            typeof<MyMenuItemCollection>,
            typeof<MyMenu>,
            null);

 member this.Items
        with get () : MyMenuItemCollection = this.GetValue(MyMenu.ItemsProperty) :?> MyMenuItemCollection
        and set (value: MyMenuItemCollection) = this.SetValue(MyMenu.ItemsProperty, value);

Проблема возникает при доступе:

for menuItem in this.Items do
    let contentElement: FrameworkElement = menuItem.Content

, где я получаю исключение нулевой ссылки для этого.Предметы;

«Элементы» вызвали исключение типа «System.NullReferenceException»

Сразу после инициализации в конструкторе:

do
    this.Items <- new CoolMenuItemCollection()

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Я думаю, что проблема в том, что static member в F # не соответствует общедоступному полю, как вы, возможно, ожидали, а свойству с get членом. Это означает, что каждый раз, когда вы получаете доступ к this.ItemsProperty, вы фактически создаете новое свойство зависимости.

Вы можете создать статическое поле следующим образом:

type Control = 
  // private static field
  static let itemsProperty : DependencyProperty =  
    DependencyProperty.Register
      ("Items", typeof<MyMenuItemCollection>, typeof<MyMenu>, null); 
  // public static property with getter 
  static member ItemsProperty = itemsProperty  

  // You can use both private 'itemsProperty' field or public property here
  member this.Items 
    with get () : MyMenuItemCollection = 
      this.GetValue(itemsProperty) :?> MyMenuItemCollection 
    and set (value: MyMenuItemCollection) = 
      this.SetValue(itemsProperty, value) 
0 голосов
/ 18 мая 2010

Метод получения CLR НЕ вызывается большинством фреймворков. То есть для удобства доступа разработчика есть код за файлами.

Внутри вашего конструктора было бы отличное место для инициализации коллекции, если вам нужно.

НЕ устанавливайте значение по умолчанию (пустое в объявлении свойства зависимостей выше) для пустой коллекции. Значением по умолчанию является общий статический экземпляр, поэтому каждый экземпляр вашего элемента управления будет использовать один и тот же список, а не то, что вы собираетесь.

...