gpt4 book ai didi

c# - 绑定(bind)到 VirtualizingStackPanel 上的数据中断

转载 作者:IT王子 更新时间:2023-10-29 04:51:18 26 4
gpt4 key购买 nike

首先,免责声明,我正在使用 .net 3.5 的 virtualizingstackpanel。如果您在未来的版本中有不同的行为,请告诉我。使用 ListView 设置测试用例相对简单,您可以对其进行测试。

我在 virtualizingstackpanel 中有一个 itemcontainer 样式,它将属性 IsSelected 绑定(bind)到 View 模型。

当我在屏幕外的 View 模型中选择一个未选择的项目,然后滚动到该项目时,datacontext (viewmode) 和实际的 listviewitem 都将 IsSelected 属性设置为 true(预期行为)。触发器已正确应用于突出显示它的 listviewitem。

但是,当我取消选择不在 View 中的项目的数据上下文然后向下滚动直到项目在 View 中时,在到达项目并创建它时,项目的数据上下文现在具有 IsSelected = true 和 listviewitem 的 IsSelected 属性也是如此,因此 listviewitem 以来自触发器的选择矩形结束(不正​​确的行为)。

几乎就好像 ListViewItem 的属性在项目创建时全部恢复(这对我来说很有意义,但之后它们应该将数据上下文的值绑定(bind)到项目)。

但这似乎并没有发生。此外,在取消选择该项目失败并向后滚动以找到它被选中之后。如果我然后选择/删除它,则绑定(bind)对该项目没有影响。

我看不出为什么它会在屏幕外的 View 模型中选择一个项目时起作用,而不是在我取消选择屏幕外的项目时起作用。在这两种情况下,新创建的项目都需要重新绑定(bind)到 View 模型的当前值。但是,一个有效,另一个无效。

编辑:好的,所以我似乎无法使用回收模式和绑定(bind)。谢谢@devhedgehog。会给你赏金,但你需要一个答案。我发誓我之前尝试过,但也许我之前没有在绑定(bind)的 ListView 中处理点击事件,所以我打破了物理选择或其他东西的绑定(bind)。我确实记得曾经尝试过两种模式,但可能有其他干扰,所以它不起作用。不管怎样,它现在可以工作了。

既然你提到了它,我想最好避免保留不必要的代码并从 virtualizingstackpanel 继承而不是虚拟化面板。但是我希望能够设置水平滚动范围,这需要我重新实现Iscrollinfo。但是,我无法让 virtualizingstackpanel 与 iscrollinfo 很好地交互。

      <ListView
x:Name="TestLV"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Background="Green"
ItemsSource="{Binding Path=AddedItems, Mode=OneWay}"
SnapsToDevicePixels="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingStackPanel.IsVirtualizing="true"
ScrollViewer.IsDeferredScrollingEnabled="False"
Grid.Column ="4"
MouseDown="TestLV_MouseDown"
>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=OneWay}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Grid
x:Name="SignalGrid"
Background="Transparent"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border
Name="Bd"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="true">
<ContentPresenter
x:Name="PART_Header"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
/>
</Border>
<ItemsPresenter
x:Name="ItemsHost"
Grid.Row="1"
Grid.Column="0"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected"
Value="false">
<Setter
TargetName="SignalGrid"
Property="Background"
Value="Transparent"
/>
</Trigger>
<Trigger Property="IsSelected"
Value="true">

<Setter
TargetName="SignalGrid"
Property="Background"
Value="Navy"
/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
<!--<Components:VirtualizingTilePanel
ChildSize="{Binding Path=GraphHeight}"
/>-->
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.Template>
<ControlTemplate>
<Grid >

<ScrollViewer

>
<ItemsPresenter />
</ScrollViewer>
</Grid>
</ControlTemplate>
</ListView.Template>
<!--Template Defining the layout of items in this treeview-->
<ListView.Resources>
<HierarchicalDataTemplate
ItemsSource ="{Binding Path = bits}"
DataType="{x:Type ViewModels:BusViewModel}"
>
<Grid>
<Components:CenteredTextBlock
x:Name="CommentTextBlock"
Foreground="Black"
BorderThickness="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderThickness}"
BorderBrush="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderBrush}"
HorizontalAlignment="Stretch"
Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
>
<Components:CenteredTextBlock.MainText>
<MultiBinding Converter="{StaticResource StringConcatConverter}">
<Binding Path="Alias" />
<Binding Path="SignalValueAtPrimaryMarker" />
</MultiBinding>
</Components:CenteredTextBlock.MainText>
</Components:CenteredTextBlock>

</Grid>
</HierarchicalDataTemplate>
<DataTemplate
DataType="{x:Type ViewModels:BitViewModel}"
>
<Grid>
<Components:CenteredTextBlock
Foreground="Black"
BorderThickness="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderThickness}"
BorderBrush="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderBrush}"
HorizontalAlignment="Stretch"
Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}">
<Components:CenteredTextBlock.MainText>
<MultiBinding Converter="{StaticResource StringConcatConverter}">
<Binding Path="Alias" />
<Binding Path="SignalValueAtPrimaryMarker" />
</MultiBinding>
</Components:CenteredTextBlock.MainText>
</Components:CenteredTextBlock>
</Grid>
</DataTemplate>
<DataTemplate
DataType="{x:Type ViewModels:SelectableItemViewModel}"
>
<Grid>
<Components:CenteredTextBlock
Foreground="Red"
BorderThickness="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderThickness}"
BorderBrush="{Binding RelativeSource ={RelativeSource AncestorType={x:Type ListView}}, Path=BorderBrush}"
HorizontalAlignment="Stretch"
Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
MainText="{Binding Path = FullName}"

/>
</Grid>
</DataTemplate>
</ListView.Resources>
</ListView>

最佳答案

奇怪的是,这个问题实际上似乎已经回答了,但却被列为没有答案。所以我会发布dev hedgehog在这里发表评论/回答。

Please use standard VirtualizingStackPanel without your custom measure logic. There is nothing you added special in your logic that VirtualizingStackPanel cant do. And RecyclingMode should not be Recycle but instead leave it out or change to Standard.

关于c# - 绑定(bind)到 VirtualizingStackPanel 上的数据中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com