WPF ListView: выравнивание текста в выбранных столбцах - PullRequest
5 голосов
/ 29 июля 2010
<ListView ItemsSource="{Binding MyData}">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="col1" DisplayMemberBinding="{Binding Path=value1}">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <TextBlock TextAlignment="Right" Text="{Binding Path=value1}"/>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
      <GridViewColumn Header="col2">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <TextBlock TextAlignment="Center" Text="{Binding Path=value2}"/>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
      <GridViewColumn Header="col3" DisplayMemberBinding="{Binding Path=value3}"/>
    </GridView>
  </ListView.View>
<ListView ItemsSource="{Binding MyData}">

col1 должен быть выровнен по правому краю.(Не работает)
col2 должен быть выровнен по центру.(Рабочий)
col3 должен быть выровнен по левому краю.(Работает)

Существует ли причина, по которой DisplayMemberBinding переопределяет CellTemplate?Если так, есть ли исправление для этого (все еще используя DisplayMemberBinding)?

Редактировать: в итоге я реализовал это как this :

<Window xmlns:util="clr-namespace:TestProject.Util">
  <Window.Resources>
    <Style TargetType="ListViewItem">
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    </Style>
    <Style TargetType="GridViewColumnHeader">
      <Setter Property="HorizontalContentAlignment" Value="Left"/>
    </Style>
    <DataTemplate x:Key="value1Template">
      <TextBlock TextAlignment="Right" Text="{Binding Path=value1}"/>
    </DataTemplate>
    <DataTemplate x:Key="value2Template">
      <TextBlock TextAlignment="Right" Text="{Binding Path=value2}"/>
    </DataTemplate>
  </Window.Resources>
  <Grid>
    <ListView ItemsSource="{Binding MyData}" IsSynchronizedWithCurrentItem="True" util:GridViewSort.Command="{Binding SortCommand}">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="col1" CellTemplate="{StaticResource value1Template}" util:GridViewSort.PropertyName="value1"/>
          <GridViewColumn Header="col2" CellTemplate="{StaticResource value2Template}" util:GridViewSort.PropertyName="value2"/>
        </GridView>
      </ListView.View>
    </ListView>
  </Grid>
</Window>

В кодесзади:

private RelayCommand sortCommand;
public ICommand SortCommand { get { return sortCommand ?? (sortCommand = new RelayCommand(Sort)); } }
private void Sort(object param)
{
  var propertyName = param as string;
  var view = CollectionViewSource.GetDefaultView(MyData);
  var direction = ListSortDirection.Ascending;
  if (view.SortDescriptions.Count > 0)
  {
    var currentSort = view.SortDescriptions[0];
    if (currentSort.PropertyName == propertyName)
      direction = currentSort.Direction == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
    view.SortDescriptions.Clear();
  }
  if (!string.IsNullOrEmpty(propertyName))
    view.SortDescriptions.Add(new SortDescription(propertyName, direction));
}

Ответы [ 2 ]

7 голосов
/ 29 июля 2010

DisplayMemberBinding имеет самый высокий приоритет. Вы не можете использовать его в сочетании с CellTemplate. См. здесь в разделе замечаний.

Если вы хотите выровнять содержимое по правому краю или по центру, вы должны объявить CellTemplate с привязкой (как вы это сделали) и удалить атрибут DisplayMemberBinding. Если вы также хотите изменить выравнивание заголовка столбца, вы также должны установить GridViewColumn.Header -property.

1 голос
/ 03 мая 2013

Просто добавьте следующее после тега Window:

  <Window.Resources>
    <Style TargetType="ListViewItem">
      <Setter Property="HorizontalContentAlignment" Value="Right" />
    </Style>
  </Window.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...