我在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
。
在我更新绑定到ListView的FindMyStuff()
并且更新是从ObservableCollection
完成后立即调用this.Dispatcher.RunAsync()
。我不知道这与它有什么关系。
有人可以告诉我我做错了吗?
答案 0 :(得分:0)
通常遍历可视树或按名称/类型获取项目在大多数情况下是一种错误的方式,更好的方法是实现适当的绑定。
然而,如果你想这样做,你几乎就在那里。正如我所尝试的那样应该是这样的:
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。