Проблемы с ListView.ItemContainerStyle не применяются - PullRequest
1 голос
/ 09 февраля 2012

ВВЕДЕНИЕ:

Мой код очень похож на тот, который обсуждался в этом вопросе . У меня есть столбец CheckBox в ListView (который использует GridView в качестве View), и я пытаюсь выровнять CheckBox по центру внутри столбца.

Ответ предлагает добавить ItemContainerStyle, который устанавливает HorizontalContentAlignment в Center. Я пробовал это, и это не применяет стиль.


КОД:

Вот мой код:

   <ControlTemplate x:Key="NoRedemptions">
          <Border BorderBrush="#FF7F9DB9" HorizontalAlignment="Stretch" BorderThickness="1" Background="White">
               <TextBlock Text="No Redemptions have been added" HorizontalAlignment="Center"></TextBlock>
          </Border>    
   </ControlTemplate>

   <Style x:Key="CellAlignmentStyle" TargetType="{x:Type ListViewItem}">
         <Setter Property="HorizontalContentAlignment" Value="Stretch" />
   </Style> 

   <Style TargetType="ListView" x:Key="ListViewTriggersStyle">
         <Style.Triggers>
              <DataTrigger Binding="{Binding Path=FundRedemptions.Count, UpdateSourceTrigger=PropertyChanged}" Value="0">
                  <Setter Property="ItemsSource" Value="{x:Null}"></Setter>
                  <Setter Property="View" Value="{x:Null}"></Setter>
                  <Setter Property="Template" Value="{StaticResource NoRedemptions}"/>
              </DataTrigger>
        </Style.Triggers>
   </Style>
  • Первый элемент, ControlTemplate, называемый NoRedemptions , используется, когда ListView пусто. Он по существу удаляет столбцы GridView и просто оставляет TextBox с рамкой, сообщающей пользователю, что ListView пуст.

  • Второй элемент, Style, называется CellAlignmentStyle - это стиль, скопированный по ссылке выше. Предполагается, что по центру столбца CheckBox.

  • Последний элемент, Style, называется ListViewTriggerStyle - это стиль, применяемый к ListView, который в основном удаляет привязки к нему (ItemsSource и View) и устанавливает ListView Template в NoRedemptions * ControlTemplate (первая точка маркера), отображая сообщение о том, что ListView пусто, когда ItemsSource из ListView ( FundRedemptions ) пусто.

Вот GridView, который связан как ListView View (для простоты я опустил нерелевантные столбцы):

<GridView AllowsColumnReorder="False" x:Key="ListViewView">
     <GridViewColumn x:Name="checkedColumn"  Header="Checked" Width="Auto">
           <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></CheckBox>
                </DataTemplate>
            </GridViewColumn.CellTemplate>                
        </GridViewColumn>
    </GridView>

А вот и сам оскорбительный ListView:

 <ListView 
             Grid.Row="3"  
             Style="{StaticResource ListViewTriggersStyle}" 
             ItemContainerStyle="{StaticResource CellAlignmentStyle}" 
             Grid.ColumnSpan="5" 
             View="{StaticResource ListViewView}" 
             ItemsSource="{Binding Path=FundRedemptions, UpdateSourceTrigger=PropertyChanged}">
 </ListView>

ПОПЫТКИ ПРИ РЕШЕНИИ ВЫПУСКА

Теперь, как уже упоминалось выше, Style, описанный в пуле 2, "заимствованный" из вышеуказанной ссылки, не работает на моем ListView.

  • Я пытался использовать HorizontalAlignment вместо HorizontalContentAlignment, и не работал.
  • Я пытался добавить другие сеттеры к стилю, чтобы посмотреть, применяется ли он и эти сеттеры сделал работает
  • Я попытался изменить VerticalAlignment, чтобы проверить, не является ли проблема с выравниванием и что сработало .
  • Я пытался изменить значение с Stretch, как предлагает пост SO, на Center или Right, и что не не сработало.
  • Я пытался внести изменения в выравнивания самого CheckBox и что не работал
  • Я пытался добавить выравнивание к GridView или к самому стилю ListView, и этот не работал.
  • Я попытался вставить точную копию ListView в ответе SO, и эта копия сделал работает
  • Я попытался удалить привязки Style и ItemsSource, а затем просто добавить <ListViewItem>Item1</ListViewItem> в тело ListView (чтобы посмотреть, имеет ли это отношение к ItemsSource или Style и не работает.
  • Я попытался стилизовать CheckBox в соответствии с точным набором стилей в примере, и что не сработало.

В заключение

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

u_u


EDIT

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

Я ничего не нашел.

Я так расстроен, что это может быть? Порядок Style s и Template s в UserControl.Resources изменен, могло ли это иметь значение, не вызывая явной ошибки?

На данный момент я слишком боюсь разбить его, чтобы поиграть со стилями и разобраться.

u_u

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Невозможно воспроизвести это, возможно, у вас есть один или несколько стилей в Application.Resources (например, полная тема), которые мешают, эти стили применяются в ControlTemplates и потенциально могут испортить все.

0 голосов
/ 10 февраля 2012

Вопрос останется загадкой, потому что я в основном удалил код и восстановил его, и он заработал.Я не могу воспроизвести ошибку.

Для тех из вас, кто рассматривает этот вопрос в будущем, я наткнулся на простое и болезненно очевидное решение этой проблемы.При условии, что столбец будет иметь заданную ширину (что, я думаю, будет в большинстве случаев, учитывая, что флажки в основном одинакового размера), вы можете просто установить поле для CheckBox, чтобы увеличить CheckBox до серединыколонны.Просто.Почему я не думал об этом, это вне меня, но я действительно хотел понять, что я сделал неправильно.Ну хорошо ...

u_u

...