Передать значение содержимого UserControl в элемент управления внутри него

Мне нужно расширить элемент управления картами bing, чтобы он был более удобным для пользователя MVVM (в частности, свойства ZoomLevel и BoundingRect не являются свойствами зависимостей). Я оборачиваю элемент управления в пользовательский элемент управления (мне также нужно добавить элементы, чтобы выбрать другие карты, например карты Google). Мне нужно передать Content Value UserControl в BingMapsControl :

 

<UserControl x:Class="RevOptWebControls.MVVMMapControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl" 
    xmlns:mCore="clr-namespace:Microsoft.Maps.MapControl.Core;assembly=Microsoft.Maps.MapControl"              
    d:DesignHeight="300" d:DesignWidth="400" 
    x:Name="Root"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
        <m:Map CredentialsProvider="Al_H1LepP6chseYMu31RK76El6k4SUkx2KVrxeqobE3rTXooFPieuEJ6qiuA211I" 
               CopyrightVisibility="Collapsed"  
               LogoVisibility="Collapsed" 
               ScaleVisibility="Visible" 
               NavigationVisibility="Visible" 
               x:Name="MyMap"> 
        </m:Map> 
        <ComboBox x:Name="c_MapTypes" HorizontalAlignment="Right" VerticalAlignment="Top" SelectedIndex="0" Height="30" SelectionChanged="MapTypes_SelectionChanged"> 
            <ComboBoxItem>Google Roads</ComboBoxItem> 
            <ComboBoxItem>Google Aerial</ComboBoxItem> 
            <ComboBoxItem>Bing Maps Roads</ComboBoxItem> 
            <ComboBoxItem>Bing Maps Aerial</ComboBoxItem> 
            <ComboBoxItem>Open Street Maps</ComboBoxItem> 
            <ComboBoxItem>Yahoo Street</ComboBoxItem> 
            <ComboBoxItem>Yahoo Aerial</ComboBoxItem> 
            <ComboBoxItem>Blank Map</ComboBoxItem> 
        </ComboBox> 
    </Grid> 
</UserControl>

Обновление: понял, как это сделать. Также был опубликован исходный код управления: http://basaratali.blogspot.com/2010/12/mvvm-version-of-bing-maps-with-google.html


person basarat    schedule 18.12.2010    source источник


Ответы (1)


Почему бы не попробовать Custom Control с пользовательским шаблоном. Использовать

`{TemplateBinding Content}` 

для привязки Content к элементу управления Map.

Пример:

<Style TargetType="local:MVVMMapControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MVVMMapControl">
                <Grid x:Name="LayoutRoot"
                      Background="White">
                    <m:Map CredentialsProvider="Al_H1LepP6chseYMu31RK76El6k4SUkx2KVrxeqobE3rTXooFPieuEJ6qiuA211I"
                           CopyrightVisibility="Collapsed"
                           LogoVisibility="Collapsed"
                           ScaleVisibility="Visible"
                           NavigationVisibility="Visible"
                           x:Name="MyMap"
                           Content="{TemplateBinding ContentControl.Content}"></m:Map>
                    <ComboBox x:Name="c_MapTypes"
                              HorizontalAlignment="Right"
                              VerticalAlignment="Top"
                              SelectedIndex="0"
                              Height="30"
                              SelectionChanged="MapTypes_SelectionChanged">
                        <ComboBoxItem>Google Roads</ComboBoxItem>
                        <ComboBoxItem>Google Aerial</ComboBoxItem>
                        <ComboBoxItem>Bing Maps Roads</ComboBoxItem>
                        <ComboBoxItem>Bing Maps Aerial</ComboBoxItem>
                        <ComboBoxItem>Open Street Maps</ComboBoxItem>
                        <ComboBoxItem>Yahoo Street</ComboBoxItem>
                        <ComboBoxItem>Yahoo Aerial</ComboBoxItem>
                        <ComboBoxItem>Blank Map</ComboBoxItem>
                    </ComboBox>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Класс:

public class MVVMMapControl : ContentControl // Notice this inherits from ContentControl for its Content Property
{
    public MVVMMapControl()
    {
        this.DefaultStyleKey = typeof(MVVMMapControl);
    }
}
person decyclone    schedule 18.12.2010
comment
Я понял, как это сделать. Решение опубликую позже. Это также будет работать, но мне понадобятся части шаблона и все для обработки измененного выбора, событий карты и т. д. - person basarat; 18.12.2010
comment
Фактическое решение пришло из наблюдения за тем, как MapBase наследуется от UserControl :) - person basarat; 18.12.2010
comment
Написано в блоге о том, как перенаправить свойство содержания: basaratali.blogspot.com/2010/12/ - person basarat; 18.12.2010
comment
Неплохо. Узнал что-то новое!! :) - person decyclone; 18.12.2010