2010-07-29 11 views
5
<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}"> 

kol1 ma być wyrównane do prawej. (Nie działa)
col2 ma być wyrównane do środka. (Praca)
col3 ma być wyrównany do lewej. (Praca)WPF ListView: Wyrównanie tekstu w wybranych kolumnach

Czy istnieje powód, dla którego DisplayMemberBinding nadpisuje CellTemplate? Jeśli tak, czy jest na to poprawka (przy jednoczesnym korzystaniu z DisplayMemberBinding)?

Edit: I skończyło się jego realizacji jak ten:

<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> 

W kodzie za:

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)); 
} 

Odpowiedz

7

DisplayMemberBinding ma najwyższy priorytet. Nie można go używać w połączeniu z CellTemplate. Zobacz here w sekcji uwag.

Jeśli chcesz wyrównać zawartość w prawo lub w środku, musisz zadeklarować CellTemplate wraz z powiązaniem (tak jak to zrobiłeś) i usunąć atrybut-DisplayMemberBinding. Jeśli chcesz również zmienić wyrównanie nagłówka kolumny, musisz także ustawić wartość - właściwość GridViewColumn.Header.

+0

Ok, dzięki. Chyba będę musiał zmienić mój sorter, by działał z inną wartością niż DisplayMemberBinding. – snurre

+0

Może poniższy link jest użyteczny: http://tomlev2.wordpress.com/2009/08/04/wpf-automatically-sort-a-gridview- kontynuowane/ – HCL

+0

Tak, właśnie znalazłem to. Wdrażam to teraz. Dzięki jeszcze raz! – snurre

1

Wystarczy dodać co następuje po tagu Okno:

<Window.Resources> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Right" /> 
    </Style> 
    </Window.Resources> 
+0

Wydaje mi się, że to jedyny sposób na sprawdzenie, czy działa. Kiedy określam go dla każdego szablonu komórki, to po prostu nie działa ... –