【问题标题】:Finding Control inside ListView在 ListView 中查找控件
【发布时间】:2017-02-07 19:17:42
【问题描述】:

在我的 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 将始终为空。

 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() 完成的。我不知道这是否与它的想法有关。

谁能告诉我我做错了什么?

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

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

    不过,如果你想这样做,你就快到了。正如我所尝试的,它应该像这样工作:

    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 将为空。

    【讨论】:

    • 我很高兴你写了最后一行。这让我尝试在GetChildren() 之前添加一个UpdateLayout() - 现在它工作正常。
    猜你喜欢
    • 2013-01-31
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多