我正在製作一個基於樹視圖的應用程序,當我點擊樹視圖中的項目時,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多個文本框。您可以刪除所有綁定並僅顯示文本框,並具有相同的效果。我怎樣才能加快文本框的加載速度?
我的第一個建議是讓你學習如何正確地實現['INotifyPropertyChanged'接口](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) 。 – Sheridan
'公共對象Data {get;組; - 錯 - 。使用強類型項目而不是'object'。 –
請看我更新的queston – viciouskinid