2016-08-02 27 views
1

私は、列がコンボボックス、チェックボックスなどのコントロールであるGridviewを持っています GridViewは、Entity Frameworkを使用してデータベースによってオブジェクトのリストにバインドされ、バインドはMVVMパターン。 場合によっては、クエリの要素数が少ないため、Gridviewの負荷が高速ですが、クエリで500を超えるレコードが取得され、負荷が非常に遅くなることがあります。 レコードがGridviewレコードに移動する方法はありますか?GridView Asyncを塗りつぶす方法

ここに私のGridViewのコード:

<telerik:RadGridView x:Name="dtgResumen" AutoGenerateColumns="False" CellEditEnded="dtgResumen_CellEditEnded" GridLinesVisibility="Both" ItemsSource="{Binding LstAvancesCuvs, Mode=TwoWay, IsAsync=True}" RowIndicatorVisibility="Collapsed" SelectionMode="Multiple" SelectionUnit="FullRow"> 
    <telerik:RadGridView.Columns> 

    <telerik:GridViewComboBoxColumn x:Name="colEstatus" Width="1.4*" Header="ESTATUS" IsFilterable="False" Tag="0"> 
     <telerik:GridViewComboBoxColumn.CellTemplate> 
      <DataTemplate> 
       <telerik:RadComboBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectedIndex="{Binding EstatusCUV, Mode=TwoWay}" SelectionChanged="comboBox_SelectionChanged"> 
        <telerik:RadComboBoxItem Content="Cancelada" Foreground="Red" /> 
        <telerik:RadComboBoxItem Content="Activa" Foreground="Green" /> 
       </telerik:RadComboBox> 
      </DataTemplate> 
     </telerik:GridViewComboBoxColumn.CellTemplate> 
    </telerik:GridViewComboBoxColumn> 

    <telerik:GridViewDataColumn x:Name="colId" Width="Auto" DataMemberBinding="{Binding IdCUVExcel}" Header="ID" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colMza" Width="Auto" DataMemberBinding="{Binding Manzana}" Header="MZA" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colLot" Width="Auto" DataMemberBinding="{Binding Lote}" Header="LOT" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colNo" Width="Auto" DataMemberBinding="{Binding NumeroExterior}" Header="No" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colInt" Width="Auto" DataMemberBinding="{Binding NumeroInterior}" Header="INT" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colEdif" Width="Auto" DataMemberBinding="{Binding Edificio}" Header="EDIF" IsFilterable="False" IsReadOnly="True"/> 

    <telerik:GridViewDataColumn x:Name="colAvanceIndividual" Width="*" Background="{Binding ColorAvance}" DataMemberBinding="{Binding AvanceIndividual, Mode=TwoWay}" IsFilterable="True" IsReadOnly="True"> 
     <telerik:GridViewDataColumn.Header> 
      <TextBlock Text="% Avance Individual" TextAlignment="Center" TextWrapping="Wrap" /> 
     </telerik:GridViewDataColumn.Header> 
     <telerik:GridViewDataColumn.CellStyle> 
      <Style TargetType="telerik:GridViewCell"> 
       <Setter Property="Foreground" Value="{Binding ColorAvance}" /> 
      </Style> 
     </telerik:GridViewDataColumn.CellStyle> 
    </telerik:GridViewDataColumn> 

    <telerik:GridViewDataColumn x:Name="colDtu" DataMemberBinding="{Binding DTU, Mode=TwoWay}" Header="DTU" IsFilterable="False"> 
     <telerik:GridViewDataColumn.CellTemplate> 
      <DataTemplate> 
       <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="5" Click="CheckBox_Click" IsChecked="{Binding DTU, Mode=TwoWay}" /> 
      </DataTemplate> 
     </telerik:GridViewDataColumn.CellTemplate> 
    </telerik:GridViewDataColumn> 

    <telerik:GridViewDataColumn x:Name="colPC" Width="*" DataMemberBinding="{Binding PC, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colE" Width="*" DataMemberBinding="{Binding Estructura, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colIHS" Width="*" DataMemberBinding="{Binding IHS, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colIE" Width="*" DataMemberBinding="{Binding IE, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colIG" Width="*" DataMemberBinding="{Binding IGE, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colAlbanileria" Width="*" DataMemberBinding="{Binding Albañileria, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colAcabados" Width="*" DataMemberBinding="{Binding Acabados, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colCHC" Width="*" DataMemberBinding="{Binding CHC, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 
    <telerik:GridViewDataColumn x:Name="colELE" Width="*" DataMemberBinding="{Binding ELE, Mode=TwoWay}" IsFilterable="False" Tag="1"/> 

    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 

ここに私のモデル:

public class MainWindowViewModel : BindableBase 
{ 
    private ObservableCollection<AvanceObra> _lstAvancesCuvs; 
    public ObservableCollection<AvanceObra> LstAvancesCuvs 
    { 
     get { return _lstAvancesCuvs; } 
     set 
     { 
      _lstAvancesCuvs = value; 
      OnPropertyChanged(); 
     } 
    } 

    public MainWindowViewModel() 
    { 
     _lstAvancesCuvs = new ObservableCollection<AvanceObra>(); 
    } 
} 
+0

Telerikコンポーネントがモデルにバインドされているので、私は(記録を一つずつ持参)それが可能だろうとは思わないを持っています。結果をページングするようにGridViewを設定することができます。あるいは、MVVMバインディングを取り除き、オンデマンドでコード内のデータをロードすることもできます。 – Transcendent

+0

データの負荷を最適化する方法はありますか?それは必ずしも1つずつである必要はありません – Richard

+0

もちろん、データソースも非同期でも満たす必要があります。 – lokusking

答えて

2

ここではあなたがあなたの行動の非同期を処理する方法に、本当に簡単な例です:

XAML-スニペット

<StackPanel > 
     <Button Content="FillData" Click="ButtonBase_OnClick"></Button> 
     <ListView ItemsSource="{Binding Files, Mode=OneWay, IsAsync=True}"></ListView> 
    </StackPanel> 

コード

public partial class Window1 
    { 
     private object _lock = new object(); 
     public Window1() 
     { 
      InitializeComponent(); 
      BindingOperations.EnableCollectionSynchronization(this.Files, this._lock); 

      this.DataContext = this; 
     } 

     public ObservableCollection<string> Files => this._files; 

     private ObservableCollection<string> _files = new ObservableCollection<string>(); 

     private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      await Task.Run(() => 
      { 
       foreach (var file in Directory.GetFiles(yourPath) 
       { 
        this.Files.Add(file); 
       } 
      }); 
     } 
    } 

私はこの迅速かつ汚いやった、なぜコードビハインドのthats。

BindingOperations.EnableCollectionSynchronization(this.Files, this._lock);に注目してください。

これにより、async-mechanismを使用して、別のスレッドからコレクションを更新できます。それはそうであるべきです。

は楽しい

+0

ありがとう、私はそれを試してみよう! – Richard

+0

Irが動作しない:( – Richard

+0

あなたは説明してもらえますか?例外?Gui-Freeze? – lokusking

関連する問題