2009-11-04 40 views
0

首先,我想解釋我正在嘗試做什麼。我有一個ListViewUserControlDataTemplate定義爲資源。我想隱藏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; 
} 

我發現了兩個問題,

  1. 這行16項後(ListBoxItem)list_proyectos.ItemContainerGenerator.ContainerFromItem(item);返回null。該列表視圖有1576個項目

  2. 當ListView被顯示,並且前16個項目隱藏按鈕時,如果我向下滾動到結尾,然後再次返回頂部,則按鈕再次可見。

+1

你的代碼示例看起來過於複雜,你正在嘗試做什麼。你能否試着在你的ListView中解釋你想要的行爲是什麼? – japf 2009-11-04 20:34:00

回答

2

ListView正在使用虛擬化,因此它不會爲其知道不需要顯示的項目創建任何容器。這是一件「好事」,特別是考慮到你有1576件物品。

也許你可以解釋爲什麼你希望能夠獲得不可見物品的容器,並且我們可以提供更好的建議,只要你可以做什麼。

+0

確定放幾句話,我期望的行爲是當用戶沒有管理權限時隱藏ListView中的刪除按鈕。 – germandb 2009-11-05 09:48:33

+1

然後,您應該使用模板內的綁定,根據用戶是否爲管理員來更改按鈕的可見性。假設你在視圖模型中有一個IsAdmin屬性,你只需要將Visibility屬性綁定到具有BooleanToVisibilityConverter的屬性。 – 2009-11-05 15:25:15

+0

感謝您的回覆,我正在努力 – germandb 2009-11-05 18:57:46

相關問題