2009-04-15 26 views
1

我在app.xaml中定义了样式。这种样式包含几个文本TextBlocks,当我将样式应用于对象时,我想控制这种样式,在这种情况下是UserPin。 如何访问这些TextBlocks运行时? 我通过获取其风格:Silverlight:将datacontext应用于样式中的元素

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。正如你所看到的,我试图将一个datacontext和一个数据绑定应用到该领域。这是有效的,但是当然所有的对象都会得到“Initial Name”的值。

我的问题是:

  1. 我怎么能将我的DataContext这样txtBottom.Text变化,或
  2. 我怎样才能改变TextBlock命名txtBottom不绑定的价值?
  3. 总之我可以访问这些字段或属性吗?

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

我觉得是这样的:

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

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

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

回答

2
  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 
    } 
    
+0

感谢您的回答。 方案2解决了这个问题。我发现这里的关键是OnApplyTemplate,这是因为我在帮助中的备注下找到的: “调用GetTemplateChild以便返回对实例化后来自模板的对象的引用。” /Øyvind – 2009-04-20 13:06:29

相关问题