WPB ListBox ItemPanel SelectChanged выбирает lastItem - PullRequest
0 голосов
/ 17 июня 2011

У меня есть список, в котором используется холст в ItemsPanel для размещения элементов с помощью привязки на полях, все это прекрасно работает. Однако нажатие на поле списка срабатывает только один раз и всегда возвращает последний элемент в списке.

Код:

<Grid>
  <ListBox Name="lstItems" ItemsSource="{Binding Itemss}"  Width="Auto" Height="497"  Margin="0,40,0,10" SelectionChanged="ListBox_SelectionChanged">
    <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
        <Canvas Name="cnvItems">
        </Canvas>

      </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Grid Margin="{Binding XYMargin}">
          <Border BorderBrush="Silver" BorderThickness="5" Height="{Binding XYWidth}" Width="{Binding XYWidth}" HorizontalAlignment="Left" Margin="0,0,0,0" Name="border5" VerticalAlignment="Top" Background="#81FFFFFF" CornerRadius="10" />
            <StackPanel Margin="5,5,0,0" HorizontalAlignment="Center" Orientation="Horizontal">
              <TextBlock Margin="0,0,0,0" Width="{Binding XYWidth}" Text="{Binding Label1}"   TextAlignment="Left"  FontSize="30" />
            </StackPanel>
        </Grid>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>

</Grid>

Есть идеи, почему я получаю только последний элемент в списке?

1 Ответ

1 голос
/ 17 июня 2011

Если вы используете Canvas для создания макета, он размещает элементы в ItemContainerStyle один поверх другого, поэтому последний видимый элемент будет помещен в холст.Подумайте о том, чтобы положить набор стеклянных панелей друг на друга, и ваши предметы будут просто рисоваться все ниже и ниже на каждом новом стекле.Вы все еще можете касаться только верхнего стекла, даже если предмет нарисован снизу.

Решение:

Попробуйте переместить

Margin = "{Binding XYMargin}"

из шаблона данных и вставить в ваш ItemContainerStyle.

Пример: (упрощено для ясности):

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
       <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <Border x:Name="LayoutRoot" 
                    Margin="{Binding XYMargin}">                                            
                    <ContentControl 
                        x:Name="ContentContainer" 
                        ContentTemplate="{TemplateBinding ContentTemplate}" 
                        Content="{TemplateBinding Content}" 

                </Border>
            </ControlTemplate>
        </Setter.Value>
       </Setter>
    </Style>
</ListBox.ItemContainerStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...