2010-07-29 46 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 được cho là căn phải. (Không hoạt động)
col2 được cho là căn giữa. (Đang hoạt động)
col3 được cho là căn trái. (Làm việc)Chế độ xem danh sách WPF: Căn chỉnh văn bản trong các cột được chọn

Có lý do gì để DisplayMemberBinding ghi đè CellTemplate không? Nếu vậy, có một sửa chữa cho điều này (trong khi vẫn còn sử dụng DisplayMemberBinding)?

Edit: tôi đã kết thúc việc thực hiện nó như này:

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

Trong đoạn mã sau:

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

Trả lời

7

DisplayMemberBinding có ưu tiên cao nhất. Bạn không thể sử dụng nó kết hợp với CellTemplate. Xem here trong phần nhận xét.

Nếu bạn muốn căn giữa hoặc căn giữa nội dung, bạn phải khai báo CellTemplate với sự ràng buộc (như bạn đã làm) và loại bỏ thuộc tính DisplayMemberBinding. Nếu bạn cũng muốn thay đổi căn chỉnh tiêu đề cột, bạn cũng phải đặt GridViewColumn.Header -property.

+0

Được rồi, cảm ơn. Tôi đoán tôi sẽ phải thay đổi sorter của tôi để làm việc với một số giá trị khác hơn DisplayMemberBinding. – snurre

+0

Có thể liên kết sau hữu ích: http://tomlev2.wordpress.com/2009/08/04/wpf-automatically-sort-a-gridview-continued/ – HCL

+0

Đúng, tôi vừa tìm thấy nó. Thực hiện điều đó ngay bây giờ. Cảm ơn một lần nữa! – snurre

1

Chỉ cần thêm những điều sau đây sau khi thẻ Window của bạn:

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

Điều này dường như là cách duy nhất để làm cho nó hoạt động cho tôi. Khi tôi chỉ định nó cho mỗi mẫu ô, nó không hoạt động ... –

Các vấn đề liên quan