2016-04-19 4 views
0

問題が発生しました(ObservableCollectionにアイテムが追加された後に)UI参照が返されます。だから、アイテムがコレクションに追加されたら、私は "Border"リファレンスを取得したいと思います。WPF ObservableCollection <T>追加された要素から参照を取得

Googleは解決策を試していましたが、見つけられませんでした。

XAML、私が望むのは、DatatemplateでBorderを返すことです(これは可能でしょうか)?

<ItemsControl ItemsSource="{Binding Elements}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Margin="37,0,0,0" Orientation="Horizontal" HorizontalAlignment="Left" Width="590" Height="29" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="{x:Type ContentPresenter}" /> 
     </ItemsControl.ItemContainerStyle> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Border Width="{Binding Style.Background.Width}" Margin="{Binding Style.Background.Position, Converter={StaticResource LeftMarginConverter}}" BorderThickness="{Binding Style.Background.BorderSize}" BorderBrush="{Binding Style.Background.BorderColor, Converter= {StaticResource MediaBrushConverter}}" Height="27" HorizontalAlignment="Center" VerticalAlignment="Center"> 
        <Border.Background> 
         <LinearGradientBrush GradientStops="{Binding Style.Background.Background, Converter={StaticResource GradientConverter}}" Opacity="{Binding Style.Background.Opacity}"/> 
        </Border.Background> 

        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center"> 
         <TextBlock Text="{Binding Value}" FontFamily="{Binding Style.Value.Font, Converter= {StaticResource FontConverter}}" Foreground="{Binding Style.Value.FontColor, Converter= {StaticResource MediaBrushConverter}}" FontSize="{Binding Style.Value.FontSize}" TextAlignment="Center" Opacity="1" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         <TextBlock Text="{Binding TextExtension}" FontFamily="{Binding Style.Value.Font, Converter= {StaticResource FontConverter}}" Foreground="#eaeaea" FontSize="{Binding Style.Value.FontSize}" TextAlignment="Center" Opacity="1" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
        </StackPanel> 
       </Border> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 


     foreach(var x in Elements) // Elemets = ObservableCollection 
     { 
      var i =FControls.ItemContainerGenerator.ContainerFromItem(x) as Border; 

      MessageBox.Show(i.ToString()); /// Returns null 
     } 
+0

IMO UI要素を取得したり、ビューモデル内の特定の種類のコントロールにバインドされていると仮定してはいけません。ちょっとしたメモ。 –

答えて

0

残念ながら、ObservableCollectionは、あなたが望む機能を提供していません。 ItemsControl.ItemContainerGenerator.ContainerFromItem()を使用して、DataTemplateをラップするContentControlを取得することができます。

+0

わかりました。 あなたのコードを適用しようとしましたが、正しく使用しているかどうかわかりません(最初の投稿を更新しました) – user3447537

+0

@ user3447537 'ContainerFromItem()'の戻り値は 'Border'ではなく' ItemsControl'です。 'Border'は' ItemsControl.Content'プロパティにあります。 –

+0

これは今働いている(.Loadedイベントも待たされていた)、ありがとう:) – user3447537

関連する問題