UserControl со свойством List <T>- есть шанс для декларативного определения? - PullRequest
2 голосов
/ 18 января 2012

У меня есть UserControl со следующим свойством:

public List<Rect> HotSpots
{
   get { return (List<Rect>)GetValue(HotSpotsProperty); }
   set { SetValue(HotSpotsProperty, value); }
}

public static readonly DependencyProperty HotSpotsProperty =
        DependencyProperty.Register("HotSpots", typeof(List<Rect>), typeof(ImageViewPort), new FrameworkPropertyMetadata(HotSpotsChanged));

Поскольку скомпилированный XAML (по умолчанию XAML 2006) не поддерживает обобщенные средства, как это допускает спецификация 2009 года, мне интересно, есть ли шанс сделать что-то вроде следующего:

<WPF:ImageViewPort Grid.Row="1">
   <WPF:ImageViewPort.HotSpots>
      <Rect Location="0,0" Height="30" Width="50"></Rect>
       <Rect Location="10,35" Height="30" Width="20"></Rect>
   </WPF:ImageViewPort.HotSpots>
 </WPF:ImageViewPort>

Или мой единственный шанс - Биндинг, подобный следующему?

<WPF:ImageViewPort Grid.Row="1" HotSpots="{Binding Path=HotSpots}"/>

Просто из любопытства ограничение представляется поддержкой XAML для дженериков, поэтому написание производного List должно помочь, не так ли?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Поскольку XAML используется не для добавления к коллекциям, а для установки их, мне пришлось создать обертывающий узел XAML, который инициализирует коллекцию. Поскольку коллекция является общей, я не могу сделать это как есть, но мне нужно создать обертку примерно так:

public class HotSpotList : List<Rect> {}

В моем XAML я могу установить его так:

<WPF:ImageViewPort.HotSpots>
  <HotSpotList>
   <Rect Location="0,0" Height="30" Width="50"></Rect>
   <Rect Location="10,35" Height="30" Width="20"></Rect>
  </HotSpotList>
</WPF:ImageViewPort.HotSpots>

Достаточно просто, как только вы увидите, что это работает =)

1 голос
/ 18 января 2012

Код XAML, который вы разместили, должен нормально работать, вам просто нужно убедиться, что коллекция HotSpots инициализирована заранее. Просто инициализируйте его в конструкторе вашего ImageViewPort класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...