【问题标题】:WPF ListView: Aligning text in selected columnsWPF ListView:对齐选定列中的文本
【发布时间】:2011-03-22 13:50:05
【问题描述】:
<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));
}

【问题讨论】:

    标签: c# wpf gridview listview


    【解决方案1】:

    DisplayMemberBinding 具有最高优先级。您不能将它与 CellTemplate 结合使用。请参阅备注部分中的here

    如果您想右对齐或居中对齐内容,您必须声明 CellTemplate 与绑定(如您所做的那样)并删除 DisplayMemberBinding 属性。如果还想更改列标题对齐方式,还必须设置GridViewColumn.Header-property。

    【讨论】:

    • 好的,谢谢。我想我必须更改我的排序器才能使用 DisplayMemberBinding 以外的其他值。
    • 也许以下链接有用:tomlev2.wordpress.com/2009/08/04/…
    • 是的,我刚刚找到它。现在实施。再次感谢!
    【解决方案2】:

    只需在 Window 标签后添加以下内容:

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

    【讨论】:

    • 这似乎是让它为我工作的唯一方法。当我为每个单元格模板指定它时,它就不起作用了......
    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2011-05-11
    • 2016-02-20
    • 2011-12-17
    • 2013-06-14
    • 2021-05-05
    相关资源
    最近更新 更多