首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGridColumn DisplayMemeberBinding

WPF DataGridColumn DisplayMemeberBinding
EN

Stack Overflow用户
提问于 2017-12-29 16:06:33
回答 1查看 130关注 0票数 0

我有一个ListView排序程序:

代码语言:javascript
复制
    /// <summary>
    /// Handle the event of clicking on a column header to sort
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void GridViewColumnHeaderClicked(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;

        if (headerClicked == null)
            return;

        if (headerClicked.Role == GridViewColumnHeaderRole.Padding)
            return;

>>>     var sortingColumn = (headerClicked.Column.DisplayMemberBinding as Binding)?.Path?.Path;
        if (sortingColumn == null)
            return;

        var direction = ApplySort(Items, sortingColumn);

        if (direction == ListSortDirection.Ascending)
        {
            headerClicked.Column.HeaderTemplate =
                Resources["HeaderTemplateArrowUp"] as DataTemplate;
        }
        else
        {
            headerClicked.Column.HeaderTemplate =
                Resources["HeaderTemplateArrowDown"] as DataTemplate;
        }

        // Remove arrow from previously sorted header
        if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
        {
            _lastHeaderClicked.Column.HeaderTemplate =
                Resources["HeaderTemplateDefault"] as DataTemplate;
        }

        _lastHeaderClicked = headerClicked;
    }

ListView.View是使用DisplayMemberBinding定义的时,它运行良好,如下所示:

代码语言:javascript
复制
    <!-- Name -->
    <GridViewColumn Width="200" 
                    DisplayMemberBinding="{Binding FullName}">
        <GridViewColumn.Header>
        <GridViewColumnHeader Content=" Name"
                              HorizontalContentAlignment="Left" />
        </GridViewColumn.Header>
    </GridViewColumn>

我现在有一个要求,使一些列对齐,所以我必须使用这样的东西:

代码语言:javascript
复制
<!-- Name -->
<GridViewColumn Width="200">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding FullName}"
                       TextAlignment="Right" />
            </DataTemplate>
    </GridViewColumn.CellTemplate>
    <GridViewColumn.Header>
    <GridViewColumnHeader Content=" Name"
                          HorizontalContentAlignment="Left" />
    </GridViewColumn.Header>
</GridViewColumn>

但是,我现在不再有一个DisplayMemberBinding来引用排序过程(用>>>标记的行)。有办法从CellTemplate -> TextBlock找到绑定吗?我一直在使用Snoop挖掘C#代码和XAML代码,但是找不到绑定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 16:16:05

我会亲自写一个附加的财产:

代码语言:javascript
复制
public static class GridViewExt
{
    #region GridViewExt.SortColumnPath Attached Property
    public static String GetSortColumnPath(GridViewColumn obj)
    {
        return (String)obj.GetValue(SortColumnPathProperty);
    }

    public static void SetSortColumnPath(GridViewColumn obj, String value)
    {
        obj.SetValue(SortColumnPathProperty, value);
    }

    public static readonly DependencyProperty SortColumnPathProperty =
        DependencyProperty.RegisterAttached("SortColumnPath", typeof(String), typeof(GridViewExt),
            new PropertyMetadata(null, SortColumnPath_PropertyChanged));

    private static void SortColumnPath_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var target = d as GridViewColumn;
    }
    #endregion GridViewExt.SortColumnPath Attached Property
}

用法:

代码语言:javascript
复制
private void GridViewColumnHeaderClicked(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;

    if (headerClicked == null)
        return;

    if (headerClicked.Role == GridViewColumnHeaderRole.Padding)
        return;

    //  ...if DisplayMemberPath is null...
    var sortingColumn = GridViewExt.GetSortColumnPath(headerClicked.Column);

    if (sortingColumn == null)
        return;

XAML:

代码语言:javascript
复制
<GridViewColumn 
    Width="200"
    local:GridViewExt.SortColumnPath="FullName"
    >
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding FullName}"
                       TextAlignment="Right" />
            </DataTemplate>
    </GridViewColumn.CellTemplate>

我有一个概念,您可以同时使用DisplayMemberBindingCellTemplate,但是如果使用DisplayMemberBinding,则不考虑CellTemplate

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48025226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档