2013-11-15 37 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.

一個完整的例子另一種情況是,你加載的所有項目,並使用該頁面會根據需要在項目的控制。我會使用一個可以處理這種分頁的控件。