我创建了一个GridView。我已经为它设置了一个ItemTemplate。
<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;
}
例如,gridview中有300辆汽车。问题是当我开始向下滚动时,绑定会转到每个将要显示的汽车的IsSelected属性,无论我是否向上,向下...如果我已经返回已经&#34;已加载&#34;汽车仍然绑定正在寻找物业价值。如果有更多属性,如果在某个控件上设置了绑定,它将转到每个属性。这使滚动变得不可能,因为它因此非常不稳定。
为什么绑定试图在项目滚动到视图时获取值? 我尝试使用绑定而不是x:bind,我尝试设置模式:单向,双向,一次......我尝试设置UpdateSourceTrigger = PropertyChanged ...但每次都是相同的结果。
任何线索我在这里做错了什么?
答案 0 :(得分:0)
看起来您正在使用此数据模板禁用UI虚拟化,因为Grid是完全动态调整大小的。尝试明确设置Grid的大小以恢复虚拟化。
有关详情,请参阅https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview。