Как прочитать содержимое связанной ObservableCollection в пользовательском элементе управления - PullRequest
1 голос
/ 28 ноября 2011

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

Пример кода: -

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

<ViewerControl:Viewer x:Name="Viewer"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Stretch"
                      MouseMove="OnMouseMove">
</ViewerControl:Viewer>

Затем я могу определить слой карты и добавить его на карту в коде, например: -

var layerDefinition = new WMSLayerDefinition("AFG_AGS_1M_MFS",
                                             new Extent(59.7812, 26.9152, 75.5985, 40.9476),
                                             "EPSG:4326") { IsSelectable = true };
var wmsLayer = new WMSLayer(Viewer.GetViewController(),
                            layerDefinition,
                            "http://ogc.bgs.ac.uk/cgi-bin/BGS_AGS_EN_Bedrock_and_Structural_Geology/wms/");
Viewer.GetLayerManager().GetLayerGroup(layerGroupName).AddLayer(wmsLayer);

То, что я хотел бы сделать, это связать ObservableCollection WMSLayer (или мою собственную модель, которая немного более универсальна, чем та, которую использует зритель) с наблюдателем, однако, поскольку у меня нет Доступ к коду просмотра Я предполагаю, что мне нужно написать элемент управления wrapper.

Насколько я вижу, элемент управления wrapper должен содержать экземпляр стороннего пользовательского элемента управления и DependencyProperty, чтобы позволить мне связать ObservableCollection данных слоя карты, чтобы я мог использовать его как параметры для методов на стороннем пользовательском контроле.

Я прочитал так много примеров привязки в пользовательских элементах управления, что у меня кружится голова, к сожалению, все они имеют дело с представлением связанных данных в пользовательском интерфейсе. Я хочу передать связанные данные другому элементу управления, который позаботится о презентации. Я знаю, что это не совсем правильный способ работы элементов управления Silverlight , но я не имею никакого влияния на дизайн стороннего usercontrol Я не вижу другого способа обойти это.

Может ли кто-нибудь помочь мне понять, как я могу получить доступ к связанным данным в моем wrapper usercontrol и передать их в методы, предоставляемые сторонним usercontrol, пожалуйста?

Заранее спасибо: о)

1 Ответ

0 голосов
/ 28 ноября 2011

Этот ответ несколько зависит от того, кто владеет ObservableCollection, но должен быть достаточно податливым, чтобы удовлетворить ваши потребности.

Простым решением является подключение к интерфейсу INotifyCollectionChanged, предоставляемому ObservableCollection:

// FrameworkElement.DataContextChanged (Window/Page/UserControl/etc)
private void OnDataContextChanged(object sender,
    DependencyPropertyChangedEventArgs e)
{
    // if your DataContext is some other type, do the appropriate casting
    var oldValue = e.OldValue as ObservableCollection<YourLayer>();
    if (oldValue != null)
    {
         oldValue.CollectionChanged -= LayerCollectionChanged;
    }

    var newValue = e.NewValue as ObservableCollection<YourLayer>();
    if (newValue != null)
    {
         newValue.CollectionChanged += LayerCollectionChanged;
    }
}

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

private void LayerCollectionChanged(object sender,
    NotifyCollectionChangedEventArgs e)
{
    switch (e.Action)
    {
    case NotifyCollectionChangedAction.Add:
        foreach (YourLayer layer in e.NewItems)
        {
            // custom method to handle conversion from YourLayer to WMSLayer
            this.AddLayer(layer);
        }
        break;

    case NotifyCollectionChangedAction.Remove:
        foreach (YourLayer layer in e.OldItems)
        {
            // custom method to remove a WMSLayer matching the YourLayer
            this.RemoveLayer(layer);
        }
        break;

     // handle the other notifications as you see fit
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...