2009-04-15 56 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

相關問題