繁体   English   中英

在ListView中查找控件

[英]Finding Control inside ListView

我在ListView找到一个控件(ToggleSwitch)时遇到问题。 我已尝试过在SO或网络上的其他地方找到的几种方法,但似乎没有一种方法可行。

这是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()被调用我已经更新了之后ObservableCollection绑定到ListView和更新是从做this.Dispatcher.RunAsync() 我不知道这与它有什么关系。

有人可以告诉我我做错了什么吗?

通常,遍历可视树或按名称/类型获取项目在大多数情况下是做错的方法,更好的方法是实现适当的绑定。

然而,如果你想这样做,你几乎就在那里。 我试过它应该这样工作:

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM