【问题标题】:Silverlight: Applying datacontext to an element within a styleSilverlight:将数据上下文应用于样式中的元素
【发布时间】:2009-04-15 23:10:25
【问题描述】:

我在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. 如何在不绑定数据的情况下更改名为 txtBottomTextBlock 的值?
  3. 简而言之,我可以访问这些字段或属性吗?

运行时:) 到目前为止,我发现触发器只能在 WPF 中使用。

我想到了这样的事情:

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

locationData 是我的包含数据的对象。

如果有人想知道;我在地图上放置图标并想给它们命名。

【问题讨论】:

    标签: silverlight datacontext styles


    【解决方案1】:
    1. 您不应在 TextBlock 上显式应用 DataContextDataContext 由子 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
      }
      

    【讨论】:

    • 感谢您的回答。备选方案 2 解决了这个问题。我发现这里的关键是 OnApplyTemplate 由于我在帮助中的备注下找到的内容:“调用 GetTemplateChild 以便在实例化后返回对来自模板的对象的引用。” /Øyvind
    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 2012-09-23
    • 2011-01-20
    • 2020-06-23
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多