Silverlight: применение datacontext к элементу в стиле - PullRequest
1 голос
/ 16 апреля 2009

Я определил стиль в app.xaml. Этот стиль содержит несколько текстовых текстовых блоков, которые я хотел бы контролировать, когда применяю стиль к объекту, в данном случае UserPin. Как я могу получить доступ к этим средам выполнения TextBlocks? Я получаю стиль по:

Style = Application.Current.Resources["UserPin"] as Style;

Стиль выглядит так:

<Style x:Name="UserPin" TargetType="RRML_UserControls:UserPin" >
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5" />
    <Setter Property="AnchorPoint" Value="0.5,0.5" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RRML_UserControls:UserPin">
                <Grid Height="71.969" Width="Auto">
                    <Grid.RenderTransform>
                        <ScaleTransform x:Name="PART_PinScale" />
                    </Grid.RenderTransform>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="29"/>
                        <RowDefinition Height="16"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.247*"/>
                        <ColumnDefinition Width="20"/>
                        <ColumnDefinition Width="0.753*"/>
                    </Grid.ColumnDefinitions>
                    <Image Height="Auto" Source="Resources/Users.png" x:Name="PART_imgUser" VerticalAlignment="Top" Stretch="Uniform" Margin="0,0,0,0" Grid.Column="1">
                        <Image.RenderTransform>
                            <TransformGroup>
                                <ScaleTransform/>
                                <SkewTransform/>
                                <RotateTransform/>
                                <TranslateTransform/>
                            </TransformGroup>
                        </Image.RenderTransform>
                    </Image>
                    <TextBlock HorizontalAlignment="Center" Margin="0,0,0,0" Width="Auto" Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" x:Name="txtBottom" Text="{Binding Mode=OneWay, Path=LocationName}">
                        <TextBlock.DataContext>
                            <RRML_RRMLServiceReference:Location LocationName="Initial Name"/>
                        </TextBlock.DataContext>
                    </TextBlock>                            
                    <TextBlock HorizontalAlignment="Right" Margin="0,0,0,0" VerticalAlignment="Center" Text="L" TextWrapping="Wrap"/>
                    <TextBlock Margin="0,0,0,0" Text="R" TextWrapping="Wrap" d:LayoutOverrides="Width, Height" Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Center"/>                            
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Значение TextBlock, которое я пытаюсь установить, равно txtBottom. Как вы можете видеть, я попытался применить текстовый текст и привязку данных к полю. Это работает, но все объекты, конечно, получают значение «Начальное имя».

Мои вопросы:

  1. как я могу применить мой текст данных, чтобы txtBottom.Text изменился, или
  2. как я могу изменить значение TextBlock с именем txtBottom без привязки данных?
  3. короче могу ли я получить доступ к этим полям или свойствам вообще?

Runtime :) До сих пор я обнаружил, что триггеры могут использоваться только в WPF.

Я думаю о чем-то вроде этого:

var styledobject = new NiceObject();
styledobject.Style = Application.Current.Resources["UserPin"] as Style;
styledobject.DataContext = locationData;

Где locationData - мой объект, содержащий данные.

Если кто-то задается вопросом; Я размещаю значки на карте и хочу назвать их.

1 Ответ

2 голосов
/ 16 апреля 2009
  1. Вы не должны явно применять DataContext к TextBlock. DataContext наследуется ребенком FrameworkElements. Вы должны попытаться установить контекст данных явно как можно меньше и как можно выше в дереве визуалов (для вашего же здравомыслия: -))

  2. Если это пользовательский элемент управления, вы можете переопределить метод OnApplyTemplate и использовать GetTemplateChild(string name) для получения ссылок на именованные элементы в вашем элементе управления.

    public override void OnApplyTemplate() 
    {
            base.OnApplyTemplate();
    
    TextBlock txtBottom = GetTemplateChild("txtBottom") as TextBlock;
    }
    
  3. Внешне, если необходимо, вы можете обязательно обратиться к этому конкретному элементу управления во время выполнения, используя метод расширения, чтобы пройти по дереву визуалов и найти его по имени.

    public static T FindChild<T>(this DependencyObject element, string name)
                where T : FrameworkElement
    {
    //Code to find the control
    }
    
...