Есть ли какой-нибудь более простой / лучший способ автоматически изменять размер содержимого ListView с одним столбцом? - PullRequest
1 голос
/ 25 ноября 2011

Хорошо, извините за мой английский заранее, вот что мне нужно:

Я получил ListView в XAML (WPF), где есть предметы и что мне нужночто элементы имеют ширину, равную ширине ListView.

До сих пор я делал это:

<ListView Name="lvFiles" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <Grid Width="{Binding ElementName="lvFiles", Path=ActualWidth}">
                    <!-- All the controls inside I need to present an item -->
                </Grid>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

Но, как оказалось, элементы ListView становятсяобрезается справа, когда появляется вертикальная полоса прокрутки.И он появляется, когда общая высота всех элементов превышает ListView.ActualHeight, поэтому мне нужно, чтобы привязки пользователей были более сложными и, следовательно, более сложными.

Кроме того, мои предметы, пока я тратил часы, чтобы решить эту проблему,мои вещи иногда были вырезаны справа без очевидной причины.

Итак, я пришел к такому выводу:

<ListView Name="lvFiles" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  <ListView.View>
    <GridView>
      <GridViewColumn Width="{Binding ElementName=lvFiles, Path=ActualWidth}">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <Decorator Width="{Binding RelativeSource={RelativeSource
                           Mode=FindAncestor, AncestorType=ListViewItem},
                           Path=ActualWidth}">

                    <Grid Margin="0,0,18,0">
                        <!-- All the controls inside... -->
                    </Grid>
                </Decorator>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

Это решило проблему отсечения, а также это решило проблему с одним столбцом ListViewItem авто-размер.Но сейчас это кажется не самым простым способом.Есть ли такие?

1 Ответ

3 голосов
/ 25 ноября 2011

Вы не используете заголовок, поэтому вы можете использовать ListView напрямую, не используя GridView.Что касается ширины, не регулируйте ширину содержимого, а настройте ширину ListViewItem.

Вот пример:

<Style x:Key="singleListViewItemStyle"
       BasedOn="{StaticResource {x:Type ListViewItem}}"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="Width"
            Value="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type VirtualizingStackPanel}}}" />
</Style> 

Если у вас нет существующего таргетинга на стиль ListViewItem или не хотите наследовать от него, вы можете удалить BasedOn="{StaticResource {x:Type ListViewItem}}".

AncestorType={x:Type VirtualizingStackPanel} используется потому, что по умолчанию это то, что ListView отображает его содержимое. Если у вас есть свой ListView theme, затем посмотрите следующий пример:

<ListView Name="myListView"
          ItemContainerStyle="{StaticResource ResourceKey=singleListViewItemStyle}"
          ItemsSource="{Binding Path=MyItems}"
          SelectedItem="{Binding Path=MySelectedItem, Mode=TwoWay}"
          SelectionMode="Single">
    <ListView.ItemTemplate>
        <DataTemplate>
            <!--Your favorite controls-->
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Вот ссылка для демонстрационного проекта, который я сделал для вас.Вы также можете увидеть другие мои элементы управления.

Надеюсь, это поможет.

...