2013-11-15 40 views
0

我正在制作一个基于树视图的应用程序,当我点击树视图中的项目时,listview将显示该项目的属性,如propertygrid进行编辑。当我有少量物品时,它会在我完成点击之前非常快速地加载,但是当有大约20个物品时,会有明显的延迟。我试图在下面的代码中复制这个问题,延迟并不像我的主程序那么大,但是很明显。TextBox导致列表视图加载项目延迟

下面的代码演示了当单击带有26个文本框的项目时加载视图的延迟。如果使用文本块替换数据模板中的文本框,则不存在此问题。

public class Items : INPCBase 
{ 
    public Items() 
    { 
     Rows = new ObservableCollection<ListViewItemViewModel> { }; 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
    } 

    void vm_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (Rows.Count > 1) 
     { 
      foreach (var vm in vms) 
       Rows.Remove(vm); 
     } 
     else 
     { 
      foreach (var vm in vms) 
       Rows.Add(vm); 
     } 
    } 
    public ObservableCollection<ListViewItemViewModel> Rows { get; private set; } 

} 

    public class Items1 : INPCBase 
    { 
    public ObservableCollection<ListViewItemViewModel> Rows { get; private set; } 
    public Items1() 
    { 

     Rows = new ObservableCollection<ListViewItemViewModel> { }; 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
     Rows.Add(new ListViewItemViewModel() { Data = Rows.Count }); 
    } 
} 
public class ListViewItemViewModel : INPCBase 
{ 
    public ListViewItemViewModel() 
    { 
     Group = 1; 
     Title = "Name"; 
     Data = "temp"; 
     HorizontalDataAlignment = HorizontalAlignment.Stretch; 
    } 
    public int Group { get; set; } 
    public string Title { get; set; } 
    public object Data { get; set; } 
    public HorizontalAlignment HorizontalDataAlignment { get; set; } 
    public ObservableCollection<ColumnDescriptor> Columns { get; set; } 


    } 
} 

和XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
</Window.Resources> 
<Grid x:Name="LayoutRoot"> 
    <Grid.Resources> 
     <CollectionViewSource x:Key="MyList" Source="{Binding Rows}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="Group" /> 
      </CollectionViewSource.GroupDescriptions> 
     </CollectionViewSource> 
     <DataTemplate DataType="{x:Type local:ListViewItemViewModel}"> 
      <Grid Height="25"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" SharedSizeGroup="1"/> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding Title}" VerticalAlignment="Center" HorizontalAlignment="Stretch" Grid.Column="0"/> 
       <TextBox Text="{Binding Data}" VerticalAlignment="Stretch" VerticalContentAlignment="Center" HorizontalAlignment="{Binding HorizontalDataAlignment}" Margin="4,0" Grid.Column="1"/> 
       <ItemsControl ItemsSource="{Binding Columns}" Grid.Column="2" > 
        <ItemsControl.ItemsPanel > 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal"/> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </Grid > 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ColumnDescriptor}"> 
      <Grid > 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition SharedSizeGroup="{Binding SharedSizeGroup}"/> 
       </Grid.ColumnDefinitions> 
       <ContentControl Content="{Binding DisplayObject}" VerticalAlignment="Center" Margin="4,0"/> 
      </Grid > 
     </DataTemplate> 
    </Grid.Resources> 


    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <ListBox Margin="10" FontSize="12" ItemsSource="{Binding Rows}" local:GridViewColumnResize.Enabled="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" Grid.IsSharedSizeScope="True"> 

      <ListBox.GroupStyle> 
      <x:Static Member="GroupStyle.Default"/> 
     </ListBox.GroupStyle> 

     <ListBox.Resources> 
      <ResourceDictionary Source="Resources\Properties\DataTypeResources.xaml"/> 
      </ListBox.Resources> 
    </ListBox> 
    <Button Content="Button" Height="23" Grid.Row="1" HorizontalAlignment="Left" Margin="28,10,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    <Button Content="Button" Height="23" Grid.Row="2" HorizontalAlignment="Left" Margin="28,10,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" /> 
</Grid> 

谁能告诉我,为什么文本框导致此延迟,我怎么能解决这个问题。谢谢。


据我所知,INPC心不是正确实现,我也明白,我应该有一个强类型数据而不是对象。这只是一个粗略的例子,问题不是绑定问题是在短时间内显示20多个文本框。您可以删除所有绑定并仅显示文本框,并具有相同的效果。我怎样才能加快文本框的加载速度?

+0

我的第一个建议是让你学习如何正确地实现['INotifyPropertyChanged'接口](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) 。 – Sheridan

+0

'公共对象Data {get;组; - 错 - 。使用强类型项目而不是'object'。 –

+0

请看我更新的queston – viciouskinid

回答

0

一旦我改变它以平衡延迟,我就让我的电脑在省电模式下就被注意到了。仍然希望提高速度,但没有得到任何建议。

0

您注意到的延迟有一个根源,因为您正在使用GUI线程来执行加载。尝试异步加载项目,而不是在GUI线程上。如这里这个例子

Task.Run(() => 
      { 
       Items1(); 
      }); 

我在我的博客文章Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding.

一个完整的例子另一种情况是,你加载的所有项目,并使用该页面会根据需要在项目的控制。我会使用一个可以处理这种分页的控件。