1

我有简单的测试(WPF - MVVM)客户端(用于 WCF oData 服务)应用程序:

视图模型

public class MainViewModel : ViewModelBase
{
    private MyEntities context;

    public ICollectionView Collection { get; private set; }

    private string searchString = "";
    public string SearchString
    {
        get { return searchString; }
        set
        {
            searchString = value;
            Collection.Refresh();
        }
    }

    public MainViewModel()
    {
        context = new MyEntities(new Uri("http://localhost:3780/Live.svc"));

        Collection = new CollectionView(context.Clients);
        //Collection = new CollectionView(context.Clients.ToArray());

        Collection.Filter = (o) => (o as Client).FullName.ToString().StartsWith(SearchString);
    }
}

查看

<ListBox ItemsSource="{Binding Collection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding FullName}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

<TextBox Grid.Row="1" Text="{Binding SearchString, UpdateSourceTrigger=PropertyChanged}" />

我有两个问题:

  1. 为什么 ListBox 滑块的移动会减慢 S_O___M_U_C_H(我的集合中只有 40 个客户端)?
  2. 为什么,如果我改变这个

    Collection = new CollectionView(context.Clients);
    

    对此

    Collection = new CollectionView(context.Clients.ToArray());
    

    所以要通过 IEnumerable shell 断开与上下文的“连接”(它有助于解决 UI 性能问题) - 停止工作过滤!我不明白为什么从数据上下文中断开集合会损坏过滤...

所以,我的最后一个问题是 - 是否有可能避免 GUI 性能问题并同时实现过滤?如果是这样,怎么办?

欢迎任何建议!

4

1 回答 1

1

好的,伙计们,我解决了我的问题。我应该只注意 VS输出窗口中的消息:

不完全支持直接使用 CollectionView。基本功能工作,虽然效率低下,但高级功能可能会遇到已知的错误。考虑使用派生类来避免这些问题。

解决方案很简单:

我改变了这个

Collection = new CollectionView(context.Clients);

对此

Collection = new ListCollectionView(context.Clients.ToList());

然后没有 GUI 性能问题,过滤按预期工作!

结果代码是:

视图模型:

public class MainViewModel : ViewModelBase
{
    private MyEntities context;

    public ICollectionView Collection { get; private set; }

    private string searchString = "";
    public string SearchString
    {
        get { return searchString; }
        set
        {
            searchString = value;
            Collection.Refresh();
        }
    }

    public MainViewModel()
    {
        context = new MyEntities(new Uri("http://localhost:3780/Live.svc"));

        Collection = new ListCollectionView(context.Clients.ToList());

        Collection.Filter = (o) => (o as Client).FullName.ToString().StartsWith(SearchString);
    }
}

查看:

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    
    <ListBox ItemsSource="{Binding Collection}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding FullName}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <TextBox Grid.Row="1" Text="{Binding SearchString, UpdateSourceTrigger=PropertyChanged}" />  
</Grid>

WCF 数据服务:

public static void InitializeService(DataServiceConfiguration config)
{
    config.SetEntitySetAccessRule("*", EntitySetRights.All);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;

    config.UseVerboseErrors = true; 
}
于 2012-07-04T06:09:00.890 回答