1

簡単なテスト(WPF-MVVM)クライアント(WCF oDataサービス用)アプリがあります:

ViewModel

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}" />

2つの質問があります:

  1. ListBoxスライダーの動きがS_O___M_U_C_Hの速度を低下させるのはなぜですか(コレクションには40のクライアントしかありません)。
  2. なぜ、これを変更すると

    Collection = new CollectionView(context.Clients);
    

    これに

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

    したがって、IEnumerableシェルを介してコンテキストとの「接続」を切断するには(UIパフォーマンスの問題に役立ちます)-フィルタリングの動作を停止します!コレクションをデータコンテキストから切断するとフィルタリングが損なわれる理由がわかりません...

それで、私の最後の質問は、GUIのパフォーマンスの問題を回避し、同時にフィルタリングを実装することは可能ですか?もしそうなら、どのように?

どんな提案でも大歓迎です!

4

1 に答える 1

1

わかりました、みんな、私は私の問題を解決しました。VS出力ウィンドウのメッセージに注意を払う必要があります。

CollectionViewを直接使用することは完全にはサポートされていません。基本的な機能は機能しますが、非効率的ですが、高度な機能では既知のバグが発生する可能性があります。これらの問題を回避するには、派生クラスの使用を検討してください。

解決策は簡単でした:

これを変更しました

Collection = new CollectionView(context.Clients);

これに

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

そして、GUIのパフォーマンスの問題はなく、フィルタリングは期待どおりに機能します。

結果のコードは次のとおりです。

ViewModel:

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 に答える