проблема с шаблоном данных списка и видимым состоянием - PullRequest
0 голосов
/ 02 июня 2011

У меня есть список с пользовательским контролем, установленным в качестве элемента списка.в этом списке у меня есть несколько сеток и две кнопки.

<Grid x:Name="LayoutRoot" HorizontalAlignment="Stretch">
    <Grid.RowDefinitions>
        <RowDefinition Height="120" />
        <RowDefinition x:Name="personDetailHolder" Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="92.915" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.RowSpan="2"
                Grid.ColumnSpan="2"
                Margin="0,0,-0.042,0"
                Orientation="Vertical"
                d:LayoutOverrides="Height">
        <Grid Height="117" Margin="3,0,0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="117" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Rectangle  />
            <!-- removed for brevity -->

            <Button x:Name="btnViewDetails"
                    Width="106"
                    Height="24"
                    Margin="0,0,3,6"
                    HorizontalAlignment="Right"
                    VerticalAlignment="Bottom"
                    Click="btnDetails_Click"
                    Foreground="#FFFBCE2F"
                    Style="{StaticResource ViewDetailsButton}" />
            <!--  Detail section  -->
            <Grid x:Name="personDetail"
                  Grid.Row="1"
                  MinHeight="365"
                  Margin="0,0,5,-376"
                  VerticalAlignment="Bottom"
                  RenderTransformOrigin="0.5,0.5"
                  Visibility="Collapsed">
                <Rectangle />
                <!--  removed for brevity -->   

                <Button x:Name="btnCloseDetails"
                        Width="123"
                        Height="24"
                        Margin="0,8,8,0"
                        HorizontalAlignment="Right"
                        VerticalAlignment="Top"
                        Click="btnDetails_Click"
                        Foreground="#FFFBC42F"
                        Style="{StaticResource CloseDetailsButton}" />

            </Grid>
        </Grid>
    </StackPanel>
</Grid>

Событие click btnDetails_Click вызывает событие в коде пользовательского элемента управления

private void btnDetails_Click(object sender, System.Windows.RoutedEventArgs e)
{
    UIPanelControl cp = new UIPanelControl();
    cp.CheckDetailPanelStatus(this.personDetail, this.personDetailHolder, this.btnViewDetails, this.btnCloseDetails, this.detailAnimation);
}

, которое вызывает метод

public void CheckDetailPanelStatus(Grid panelName, RowDefinition rowName, Button openButtonName, Button closeButtonName, Storyboard animi)
{
    if (panelName.Visibility == System.Windows.Visibility.Visible)
    {
        panelName.Visibility = System.Windows.Visibility.Collapsed;
        rowName.Height = new GridLength(0);
        openButtonName.Visibility = System.Windows.Visibility.Visible;
        closeButtonName.Visibility = System.Windows.Visibility.Collapsed;
    }
    else
    {
        panelName.Visibility = System.Windows.Visibility.Visible;
        rowName.Height = new GridLength(380);
        openButtonName.Visibility = System.Windows.Visibility.Collapsed;
        closeButtonName.Visibility = System.Windows.Visibility.Visible;
        animi.Begin();

    }
}

Цель здесьвернуть пользователю список результатов.Затем пользователь может нажать на кнопку «Просмотр дополнительных сведений», чтобы развернуть второй раздел, в котором отображаются дополнительные сведения о выбранной записи.Я использую подход MVVM, поэтому команда отправляется на виртуальную машину для облегчения заполнения второй записи.Поскольку анимации, видимость и т. Д. Содержались в представлении, я решил оставить эти события в коде представления.

Это решение частично работает в том, что, когда я нажимаю на кнопку, раздел расширяется для выбранного элемента списка.Однако, если прокрутить вниз до других результатов, я обнаружу, что другие элементы списка периодически раскрываются.Для этого нет повторяющегося шаблона (то есть для каждого 5-го элемента или любой другой записи). Я также видел случаи, когда, если я выбираю первую запись и расширяю ее, прокручиваю вниз до следующей записи и возвращаюсь назад, первая запись сбрасывается обратно.к рухнул.

Я в тупик относительно того, что может быть причиной этой проблемы.

Может ли кто-нибудь объяснить, почему я это вижу или как это предотвратить?

Ответы [ 3 ]

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

То, что вы видите, является результатом использования списка для повторного использования объекта для экономии памяти и повышения производительности, аналогичная вещь может происходить и в GridView.Элемент управления создает X ListBoxItems и повторно использует эти контейнеры, когда их элементы данных выходят из поля зрения (загружены / выгружены).Поэтому, если вы измените внешний вид контейнера, он изменит внешний вид всех элементов данных, которые совместно используют контейнер.

Исправить проблему вы можете либо;Обработайте события Loaded / Unloaded объекта ListBoxItem и исправьте пользовательский интерфейс при возникновении события Unloaded.Или сделайте так, чтобы элементы, которые вы привязали к выбору списка, были осведомлены и заставили их изменить внешний вид ListBoxItem, чтобы при их загрузке / выгрузке механизм привязки позаботился о сбросе пользовательского интерфейса.

0 голосов
/ 03 июня 2011

Я думаю, что это может быть лучше реализовано с использованием VisualStates, а не путем установки свойств вручную для события click.

Просто добавьте два визуальных состояния в шаблон вашего элемента списка, одно для «ShowDetails» и одно для"Скрыть детали".затем вы можете использовать поведение GoToVisualStateBehavior для переключения между ними по нажатию кнопки (которое, я думаю, должно быть ToggleButton).

В противном случае вы можете использовать кнопку Expander, чтобыреализовать это.

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

0 голосов
/ 03 июня 2011

Вместо изменения видимости с помощью команды

panelName.Visibility = System.Windows.Visibility.Collapsed;

вы хотите установить видимость в xaml что-то вроде

    <Grid x:Name="personDetail"
          Grid.Row="1"
          MinHeight="365"
          Margin="0,0,5,-376"
          VerticalAlignment="Bottom"
          RenderTransformOrigin="0.5,0.5"
          Visibility="{Binding PersonDetailVisibility}">

Предполагается, что обработчик событий измененного свойства подключен примерно так:

        PropertyChanged += new
        PropertyChangedEventHandler(PersonDetailViewModel_PropertyChanged);

Затем, после изменения свойства PersonDetailVisibility в виртуальной машине, необходимо вызвать событие измененного свойства

            this.RaisePropertyChanged(() => this.PersonDetailVisibility);
...