首先,我想解釋我正在嘗試做什麼。我有一個ListView
在UserControl
與DataTemplate
定義爲資源。我想隱藏DataTemplate中的一個按鈕。聽起來很簡單,但是....ListView.ItemContainerGenerator.ContainerFromItem(item)在20個項目後返回null
我正在使用的代碼是
<UserControl.Resources>
<DataTemplate x:Key="Proyectos">
<DockPanel Name="Panel" Margin="0,0,0,0" MinWidth="1200" MaxWidth="1200">
<Border Margin="0" BorderBrush="Bisque" BorderThickness="1" DockPanel.Dock="Left">
<StackPanel Margin="0" Width="1135">
<DockPanel>
<TextBlock Text="{Binding titulo}" Name="titulo" FontWeight="Bold" FontSize="12" />
</DockPanel>
<DockPanel >
<TextBlock FontWeight="Bold" Text="Nº Ref. Fundacion: " DockPanel.Dock="Left" Margin="5,0,5,0" FontSize="11"/>
<TextBlock Name="txb_codproy" Text="{Binding codproy}" FontSize="11"/>
<TextBlock FontWeight="Bold" Text=" Nº Ref. Proyecto: " FontSize="11"/>
<TextBlock Text="{Binding registro}" FontSize="11"/>
<TextBlock FontWeight="Bold" Text=" Estado: " FontSize="11"/>
<TextBlock Text="{Binding estados_proyecto.descripcion}" FontSize="11"/>
</DockPanel>
<DockPanel >
<TextBlock FontWeight="Bold" Text="Organismo " DockPanel.Dock="Left" Margin="5,0,5,0" FontSize="11"/>
<TextBlock Text="{Binding organismo.descripcion}" FontSize="11"/>
</DockPanel>
</StackPanel>
</Border>
<Border Margin="0" Width="Auto" BorderBrush="Transparent" BorderThickness="1" Background="White" HorizontalAlignment="Left">
<Button Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Name="btn_Eliminar" Click="btn_Eliminar_Click" Width="Auto" Height="25" Background="Transparent" BorderBrush="Transparent">
<Image Name="img_eliminar" Width="48" Source="imagenes/borrar.png" Height="19" />
</Button>
</Border>
</DockPanel>
</DataTemplate>
</UserControl.Resources>
<Grid Width="1300" Height="845.169">
<ListView Margin="20,120.024,15.247,50" MouseDoubleClick="list_proyectos_MouseDoubleClick" Name="list_proyectos" ItemsSource="{Binding}" ItemTemplate="{StaticResource Proyectos}">
</ListView>
<TextBox Margin="32,12,35,0" Name="txt_busqueda" TextChanged="textBox1_TextChanged" Background="AliceBlue" BorderBrush="Gray" Height="23" VerticalAlignment="Top" />
</Grid>
//////////////////////////////////////////////////////////
public Proyectos(IPrincipal identityA)
{
list_proyectos.ItemsSource = ListaProyectos;
list_proyectos.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (list_proyectos.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
list_proyectos.ItemContainerGenerator.StatusChanged -= ItemContainerGenerator_StatusChanged;
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, new VoidDelegate(DelayedAction));
}
}
delegate void VoidDelegate();
void DelayedAction()
{
foreach (object item in list_proyectos.Items)
{
ListBoxItem lbitem = (ListBoxItem)list_proyectos.ItemContainerGenerator.ContainerFromItem(item);
if (lbitem != null)
{
ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(lbitem);
DataTemplate myDataTemplate = contentPresenter.ContentTemplate;
Button b = (Button)lbitem.ContentTemplate.FindName("btn_Eliminar", contentPresenter);
b.Visibility = Visibility.Hidden;
}
}
}
private T FindVisualChild<T>(DependencyObject obj)
where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
T childOfChild = FindVisualChild<T>(child);
if (childOfChild != null)
return childOfChild;
}
return null;
}
我發現了兩個問題,
這行16項後
(ListBoxItem)list_proyectos.ItemContainerGenerator.ContainerFromItem(item);
返回null。該列表視圖有1576個項目當ListView被顯示,並且前16個項目隱藏按鈕時,如果我向下滾動到結尾,然後再次返回頂部,則按鈕再次可見。
你的代碼示例看起來過於複雜,你正在嘗試做什麼。你能否試着在你的ListView中解釋你想要的行爲是什麼? – japf 2009-11-04 20:34:00