2017-07-31 111 views
1

我有一个ListBox,其中包含一个带有StackPanel的ItemTemplate。我想访问该堆叠面板并更改其可见性。如何访问WPF中ListBox的DataTemplate中的控件

(改变它的能见度倒塌,当我点击mouseleftbutton“CLOSEALL”)

我可以做到这一点FindDescendantByName方法,但它适用于仅列表框的项目在屏幕上(只有前10项),但是当我向下滚动,我发现这不适用于其他列表框项目。

我认为发生错误是因为VisualTreeHelper。我可以用什么来代替VisualTreeHelper?

谢谢..

XAML代码

<ListBox x:Name="listBoxEditPast" SelectionMode="Single" Margin="0" Background="#272B34" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
        <RowDefinition/> 
       </Grid.RowDefinitions> 
       <Border Grid.Row="0" BorderThickness="4,0,0,0" Margin="2,0,0,0" Height="29" Background="#2E323B" Width="1050" BorderBrush="#1373A9" MouseLeftButtonDown="Border_MouseLeftButtonDown"> 
        <DockPanel Name="dockPanelPast" Margin="0,4,0,0"> 
         <Image Name="imgArrow" Source="images/down-arrow.png" HorizontalAlignment="Left" Width="20" Height="18"/> 
         <TextBlock Text="{Binding CreateDate}" Name="txtTarih" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16"/> 
         <TextBlock Text="{Binding SarjNo}" Name="txtSarjNo" Foreground="#FF9CA518" HorizontalAlignment="Stretch" VerticalAlignment="Center" FontSize="16" Margin="50,0,0,0" Width="90"/> 
         <TextBlock Text="{Binding Adi}" Name="txtReceteAdi" Foreground="#FF26A053" VerticalAlignment="Center" FontSize="16" Margin="40,0,0,0" HorizontalAlignment="Stretch"/> 
         <Button Content="Detaylar" Style="{StaticResource BlueButton}" HorizontalAlignment="Right" VerticalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" DockPanel.Dock="Right"/> 
        </DockPanel> 
       </Border> 
       <StackPanel Grid.Row="1" Name="stackPanelDetay" Tag="{Binding ID}"> 
        <DockPanel> 
         <TextBlock Text="Sipariş No" Foreground="#D9480F" VerticalAlignment="Center" /> 
         <TextBlock Text="Parça" Foreground="#AF0FD9" VerticalAlignment="Center" Margin="50,0,0,0" Width="200" /> 
         <TextBlock Text="Malzeme" Foreground="White" VerticalAlignment="Center" Margin="150,0,0,0" Width="90"/> 
         <TextBlock Text="Müşteri" Foreground="#AF0FD9" VerticalAlignment="Center" Margin="70,0,0,0" /> 
        </DockPanel> 
        <DockPanel> 
         <TextBlock Text="{Binding ID}" Foreground="White" VerticalAlignment="Center" Width="100"/> 
         <TextBlock Text="{Binding ParcaKoduAdi}" Foreground="White" VerticalAlignment="Center" Margin="5,0,0,0" Width="200" /> 
         <TextBlock Text="{Binding Malzeme}" Foreground="White" VerticalAlignment="Center" Margin="152,0,0,0" Width="90" /> 
         <TextBlock Text="{Binding MusteriKoduAdi}" Foreground="White" VerticalAlignment="Center" Margin="70,0,0,0" /> 
        </DockPanel> 
       </StackPanel> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

C#代码

public static class FrameworkElementExtensions 
{ 
    public static FrameworkElement FindDescendantByName(this FrameworkElement element, string name) 
    { 
     if (element == null || string.IsNullOrWhiteSpace(name)) { return null; } 

     if (name.Equals(element.Name, StringComparison.OrdinalIgnoreCase)) 
     { 
      return element; 
     } 
     var childCount = VisualTreeHelper.GetChildrenCount(element); 
     for (int i = 0; i < childCount; i++) 
     { 
      var result = (VisualTreeHelper.GetChild(element, i) as FrameworkElement).FindDescendantByName(name); 
      if (result != null) { return result; } 
     } 
     return null; 
    } 
} 

private void closeAll_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    // StackPanel panel = LayoutHelper.FindElement(listBoxEditPast, n => n.GetType() == typeof(StackPanel)) as StackPanel; 

    for (int i = 0; i < listBoxEditPast.Items.Count; i++) 
    { 
     var element = listBoxEditPast.ItemContainerGenerator.ContainerFromIndex(i) as FrameworkElement; 
     if (element != null) 
     { 
      var sp = element.FindDescendantByName("stackPanelDetay") as StackPanel; 
      if (sp != null) 
      { 
       sp.Visibility = Visibility.Collapsed; 
      } 
     } 
    } 
} 
+0

为什么不简单地将Visibility绑定到数据项类中的另一个属性? – Clemens

回答

0

注意到与visualtreehelper做的,这是因为该名单是虚拟化的,所以只前十个项目被创建,然后由接下来的十个项目替换....并且你放弃了你的mod ifications

你不能在数据模板的元素通过代码

迭代通过你的数据,在一个布尔值设置为true/false为所有,然后更改堆栈和知名度绑定到这个布尔

<StackPanel Grid.Row="1" Name="stackPanelDetay" Visibility="{Binding myBoolean, Converter=BoolToVisibility}"> 
相关问题