Подтвердить что ты не робот

Связывание с разбиением данных на VirtualizingStackPanel

Прежде всего, отказ от ответственности, я работаю с .net 3.5 virtualizingstackpanel. Если вы получите другое поведение в будущих версиях, дайте мне знать. Это относительно просто настроить тестовый пример со списком, который вы можете проверить с помощью.

У меня есть стиль itemcontainer в virtualizingstackpanel, который привязывает свойство IsSelected к viewmodel.

когда я выбираю невыбранный элемент в модели представления, который находится за пределами экрана, а затем прокручивается до этого элемента, как datacontext (viewmode), так и фактический listviewitem имеют свойство IsSelected как true (ожидаемое поведение). Триггер правильно применяется к элементу listviewitem, выделяя его.

Однако, когда я отменил выбор datacontext для элемента, который не находится в поле зрения, а затем прокрутите вниз до тех пор, пока элемент не появится, по достижении элемента и его создании объект datacontext теперь имеет IsSelected = true и свойство listSitlected listviewitem также верно, поэтому listviewitem заканчивается прямоугольником выбора из триггера (неправильное поведение).

Это почти так, как если бы свойства ListViewItem были восстановлены при создании элемента (это имеет смысл для меня, но затем они должны привязать значения datacontext к элементу позже).

Но это, похоже, не происходит. Кроме того, после отказа от отмены выбора элемента и прокрутки назад, чтобы найти его выбранным. Если я затем выбирает/снимает его, привязка не влияет на элемент.

Я не вижу никакой логической причины, почему это будет работать при выборе элемента в режиме просмотра, который выключен, а не когда я снимаю выделение элемента за кадром. В обоих случаях вновь созданный элемент должен быть отсканирован до текущего значения viewmodel. Тем не менее, один работает, а другой нет.

Любая помощь или мысли будут оценены.

изменить: О, хорошо, поэтому я просто не могу использовать режим переработки и привязки. Спасибо devhedgehog. даст вам щедрость, но вам нужен ответ. Клянусь, я попробовал это раньше, но, возможно, я не обрабатывал события click в списке listview до того, как я нарушил привязку при физическом выборе или что-то в этом роде. Я помню, как пытались оба режима в какой-то момент, но, вероятно, было что-то еще вмешиваться, так что это не сработало. В любом случае, он работает сейчас.

Поскольку вы упомянули об этом, я бы предпочел бы избегать ненужного кода и наследовать от virtualizationstackpanel вместо виртуализации панели. Но я хочу иметь возможность установить горизонтальную прокрутку, которая требует от меня переопределения Iscrollinfo. Тем не менее, у меня возникли проблемы с тем, чтобы виртуализация стоп-панели хорошо взаимодействовала с 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>
4b9b3361

Ответ 1

Кажется странным, что на этот вопрос действительно ответили, но он указан как не имеющий ответа. Поэтому я отправлю комментарий dev hedgehog здесь.

Пожалуйста, используйте стандартную VirtualizingStackPanel без вашей индивидуальной меры. логика. Вы ничего не добавили в своей логике, VirtualizationStackPanel can not do. И RecyclingMode не должен быть Переработайте, но вместо этого оставьте это или измените на стандарт.