我正在制作一个基于树视图的应用程序,当我点击树视图中的项目时,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