2011-06-02 51 views
0

我有一个用户控件设置为列表框项目的列表框。在这个列表框中,我有几个网格和两个按钮。列表框数据模板和可见状态的问题

<Grid x:Name="LayoutRoot" HorizontalAlignment="Stretch"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="120" /> 
     <RowDefinition x:Name="personDetailHolder" Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="92.915" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <StackPanel Grid.RowSpan="2" 
       Grid.ColumnSpan="2" 
       Margin="0,0,-0.042,0" 
       Orientation="Vertical" 
       d:LayoutOverrides="Height"> 
     <Grid Height="117" Margin="3,0,0,0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="117" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Rectangle /> 
      <!-- removed for brevity --> 

      <Button x:Name="btnViewDetails" 
        Width="106" 
        Height="24" 
        Margin="0,0,3,6" 
        HorizontalAlignment="Right" 
        VerticalAlignment="Bottom" 
        Click="btnDetails_Click" 
        Foreground="#FFFBCE2F" 
        Style="{StaticResource ViewDetailsButton}" /> 
      <!-- Detail section --> 
      <Grid x:Name="personDetail" 
        Grid.Row="1" 
        MinHeight="365" 
        Margin="0,0,5,-376" 
        VerticalAlignment="Bottom" 
        RenderTransformOrigin="0.5,0.5" 
        Visibility="Collapsed"> 
       <Rectangle /> 
       <!-- removed for brevity --> 

       <Button x:Name="btnCloseDetails" 
         Width="123" 
         Height="24" 
         Margin="0,8,8,0" 
         HorizontalAlignment="Right" 
         VerticalAlignment="Top" 
         Click="btnDetails_Click" 
         Foreground="#FFFBC42F" 
         Style="{StaticResource CloseDetailsButton}" /> 

      </Grid> 
     </Grid> 
    </StackPanel> 
</Grid> 

单击事件btnDetails_Click在代码中调用一个事件的用户控制

private void btnDetails_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    UIPanelControl cp = new UIPanelControl(); 
    cp.CheckDetailPanelStatus(this.personDetail, this.personDetailHolder, this.btnViewDetails, this.btnCloseDetails, this.detailAnimation); 
} 

其调用该方法的背后

public void CheckDetailPanelStatus(Grid panelName, RowDefinition rowName, Button openButtonName, Button closeButtonName, Storyboard animi) 
{ 
    if (panelName.Visibility == System.Windows.Visibility.Visible) 
    { 
     panelName.Visibility = System.Windows.Visibility.Collapsed; 
     rowName.Height = new GridLength(0); 
     openButtonName.Visibility = System.Windows.Visibility.Visible; 
     closeButtonName.Visibility = System.Windows.Visibility.Collapsed; 
    } 
    else 
    { 
     panelName.Visibility = System.Windows.Visibility.Visible; 
     rowName.Height = new GridLength(380); 
     openButtonName.Visibility = System.Windows.Visibility.Collapsed; 
     closeButtonName.Visibility = System.Windows.Visibility.Visible; 
     animi.Begin(); 

    } 
} 

这里的目标是返回给用户结果列表。用户可以点击View additional details按钮展开第二部分,其中显示有关所选记录的更多详细信息。我正在使用MVVM方法,因此命令会发送给虚拟机以方便第二个记录群。由于视图中包含动画,可见性等,因此我决定将这些事件保留在视图代码中。

此解决方案部分适用于当我点击按钮时该部分为选定的列表框项目扩展。但是,如果向下滚动到其他结果,我会发现其他列表框项目会间歇性地展开。这里没有可重复的模式(即每5个项目或每个其他记录)我也看到了一些情况,如果我选择第一条记录并展开它,然后向下滚动到下一条记录并备份第一条记录已被重置崩溃。

对于可能导致此问题的原因我很遗憾。

任何人都可以提供任何见解,为什么我看到这种情况发生或如何防止这种情况发生?

回答

0

我认为这可以更好地使用VisualStates实现,而不是在click事件上手动设置属性。

只需在列表项的模板中添加两个视觉状态,一个用于“ShowDetails”,一个用于“HideDetails”。然后你可以使用行为GoToVisualStateBehavior在点击按钮(我认为应该是ToggleButton)之间翻转它们。

否则,您可以使用Expander按钮来执行此操作。

希望这有助于:)

+0

AbdouMomen,非常感谢指针。我尝试了视觉状态和扩展器,都似乎解决了这个问题。为了简单起见,我使用了扩展器元素,但我将来肯定会使用VisualStateBehavior。 – rlcrews 2011-06-03 14:50:46

+0

很高兴帮助:) – AbdouMoumen 2011-06-03 15:42:24

0

而不是使用以下命令更改知名度

panelName.Visibility = System.Windows.Visibility.Collapsed; 

要设置在XAML的东西能见度像

<Grid x:Name="personDetail" 
      Grid.Row="1" 
      MinHeight="365" 
      Margin="0,0,5,-376" 
      VerticalAlignment="Bottom" 
      RenderTransformOrigin="0.5,0.5" 
      Visibility="{Binding PersonDetailVisibility}"> 

假设你有类似有线的属性更改事件处理程序:

 PropertyChanged += new 
     PropertyChangedEventHandler(PersonDetailViewModel_PropertyChanged); 

然后改变你的PersonDetail在虚拟机可视性财产,你需要提高的属性更改事件

  this.RaisePropertyChanged(() => this.PersonDetailVisibility); 
1

你们看到的是使用对象重用,以节省内存,提高性能列表框的结果,可能一个GridView内发生了类似的事情太多。该控件所做的是创建X ListBoxItems,并在这些容器的数据项不在视图中时重新使用这些容器(Loaded/Unloaded)。所以如果你改变容器的外观,它将改变共享容器的所有数据项的外观。

要解决这个问题,你可以; 处理ListBoxItem的Loaded/Unloaded事件并在Unloaded事件触发时修复UI。 或者,让你已经绑定到列表选择的项目知道并让他们改变ListBoxItem的外观,所以当他们被加载/卸载时,绑定引擎将负责重置UI。

+0

Agies。感谢探索如何重新使用这些物体。我对加载/卸载对象毫无头绪。你真的帮助我指出正确的方向谢谢你! – rlcrews 2011-06-03 14:48:22