2010-07-29 17 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}"> 

col1 deve essere allineato a destra. (Non funziona)
col2 dovrebbe essere allineato al centro. (Funzionante)
col3 dovrebbe essere allineato a sinistra. (Funzionante)WPF ListView: allineamento del testo nelle colonne selezionate

C'è un motivo per cui DisplayMemberBinding sta annullando CellTemplate? Se è così, c'è una soluzione per questo (mentre si usa DisplayMemberBinding)?

Edit: ho finito per la sua attuazione come questo:

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

nel codice dietro:

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

risposta

7

DisplayMemberBinding ha la massima priorità. Non è possibile utilizzarlo combinato con CellTemplate. Vedi here nella sezione commenti.

Se si desidera allineare a destra o al centro il contenuto, è necessario dichiarare il CellTemplate con il binding (come avete fatto) e rimuovere l'attributo DisplayMemberBinding. Se si desidera modificare anche l'allineamento dell'intestazione della colonna, è necessario impostare anche la proprietà GridViewColumn.Header.

+0

Va bene, grazie. Credo che dovrò cambiare il mio selezionatore per lavorare con qualche altro valore rispetto a DisplayMemberBinding. – snurre

+0

Forse il seguente link è utile: http://tomlev2.wordpress.com/2009/08/04/wpf-automatically-sort-a-gridview-continued/ – HCL

+0

Sì, l'ho appena trovato. Implementandolo ora. Grazie ancora! – snurre

1

Basta aggiungere il seguente testo dopo il tag Window:

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

Questo sembra essere l'unico modo per farlo funzionare per me. Quando lo specifichi per ogni modello di cella, non funziona ... –