2017-03-01 18 views
0

私はGridViewを作成しました。私はそれにItemTemplateを設定しました。私のモデルではC#UWP GridView DataTemplateバインディングの問題

 <GridView x:Name="gvMain" 
        HorizontalAlignment="Stretch" 
        HorizontalContentAlignment="Stretch" 
        ItemTemplate="{StaticResource GridTemplate}" 
        AllowDrop="True" 
        CanDragItems="True" 
        CanReorderItems="True" 
        ScrollViewer.VerticalScrollBarVisibility="{Binding gridViewCarsScrollViewVisible, ElementName=carsControl}"> 

    <DataTemplate x:Key="GridTemplate" x:DataType="models:Car"> 

     <Grid 
       HorizontalAlignment="Stretch"     
       Background="Transparent" 
       Tapped="CarTapped"> 

       <Border x:Name="borderBackground" 
        Background="White" 
        Opacity="{x:Bind IsSelected, Converter={StaticResource TransparencyConverter}, Mode=OneWay}"/>     

     </Grid>  

    </DataTemplate> 

私は、プロパティを持っている:

private bool isSelected; 
    public bool IsSelected 
    { 
     get { return isSelected; } 
     set { isSelected = value; OnPropertyChanged(); } 
    } 

そして、私はそれを変更しています:

private void CarTapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) 
    { 
     var grid = sender as Grid; 
     var car = grid.DataContext as Car; 

     car.IsSelected = !car.IsSelected; 
    } 

例えば300台はGridViewの中にあります。問題は、スクロールダウンを開始するときに、バインディングが表示される各車のIsSelectedプロパティに移動するかどうかに関係なく、もし私が既にロードされている車に戻っても、バインディングはプロパティ値を探しています。さらにプロパティがある場合、バインディングがいくつかのコントロールに設定されている場合は、それぞれのプロパティに移動します。このため、スクロールが不可能になります。

アイテムがスクロールされて表示されるたびに値を取得しようとしているのはなぜですか? x:bindの代わりにバインディングを使用しようとしましたが、モードを設定しようとしました:片方向、双方向、1回... UpdateSourceTrigger = PropertyChanged ...を設定しようとしましたが、

私はここで間違って何をしていますか?

+1

正確に何が起こっているのスクリーンショット/ GIFを投稿できますか?それは問題をよりよく理解するのに役立ちます – AVK

答えて

0

Gridが完全に動的にサイズ調整されているため、このデータテンプレートでUI仮想化を無効にしているようです。仮想化を復元するためにグリッドのサイズを明示的に設定してみてください。

https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listviewを参照してください。

+0

DataTemplateまたはGridViewのグリッド? – user3239349

+0

DataTemplateのグリッド – djm181

関連する問題