2017-02-07 11 views
0

ListViewの中にコントロール(ToggleSwitch)が見つかりません。私はSOまたはWeb上の他の場所でいくつかの方法を試してみましたが、どれもうまくいかないようです。ここでListView内のコントロールを見つける

は、リストビューのマークアップ

<ListView Name="LampsListView" ItemsSource="{x:Bind Lamps}"> 
    <ListView.ItemTemplate> 
     <DataTemplate x:DataType="models:Lamp"> 
      <StackPanel Name="StackPanel"> 
       <TextBlock Margin="10,0" Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Left" /> 
       <ToggleSwitch Margin="10,0" HorizontalAlignment="Right" Name="LampToggleSwitch" IsOn="{x:Bind State, Converter={ StaticResource IntToIsOn}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

である私はContainerFromItemを試してみましたが、xは常にnullになります。

foreach (var item in this.LampsListView.Items) 
{ 
    var x = this.LampsListView.ContainerFromItem(item); 
} 

もGetChildrenメソッドのアプローチそれでもGetChildrenメソッドは、それは文句を言わない私に私がして働くことができる何かを与えるアイテムを返すと思いました。

private void FindMyStuff() 
{ 
    var ch = this.GetChildren(this.LampsListView); 
} 

private List<FrameworkElement> GetChildren(DependencyObject parent) 
{ 
    List<FrameworkElement> controls = new List<FrameworkElement>(); 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     if (child is FrameworkElement) 
     { 
      controls.Add(child as FrameworkElement); 
     } 
     controls.AddRange(this.GetChildren(child)); 
    } 
    return controls; 
} 

そして、私はStackPanelを見つけるのブースを試してみましたが、LampToggleSwitchのために直進しました。

FindMyStuff()は、ListViewにバインドされたObservableCollectionを更新した直後に呼び出され、更新はthis.Dispatcher.RunAsync()から行われます。私はこれがそれとは何か関係があるかどうかは分かりません。

私が間違っていることを教えてもらえますか?

答えて

0

一般的にビジュアルツリーを横断したり、名前/タイプでアイテムを取得したりするのは、ほとんどの場合thigsを行う方法が間違っています。適切なバインディングを実装するほうがずっと良いでしょう。

しかし、これを実行したい場合は、ほとんどあります。私が試したとして、それは次のように動作するはずです:あなたがこれを実行したときに行うのならば

var listViewItem = this.mylist.ContainerFromItem(mylist.Items.First()) as ListViewItem; 
var itemsStackPanel = listViewItem.ContentTemplateRoot as StackPanel; 
var myToggleSwitch = itemsStackPanel.Children.FirstOrDefault(x => x is ToggleSwitch); 
// other way with your helper 
var childByHelper = GetChildren(listViewItem).FirstOrDefault(x => x is ToggleSwitch); 

だけリストが読み込まれる前に、listVieItemsはnullになります、気をつけてください。

+0

最後の行を書いてうれしいです。それは 'GetChildren()'の前に 'UpdateLayout()'を追加しようとしました - 今はうまくいきます。 –

関連する問題