在属性更改时更新SortMemberPath

时间:2019-11-27 17:24:17

标签: c# wpf datagrid

我有一个属性SortingName,用作我SortMemberPath中的其中一列的DataGrid。但是,我希望每次单击标题时都可以更新此属性(即再次调用其setter)。

这里是属性:

    [XmlIgnore]
    public virtual string SortingName {
        get { return m_sortingName; }
        set
        {
            if (m_sortingName == null)
                m_sortingName = value;
            m_sortingName = m_sortingName.StartsWith("_") ? value : "_" + value;
        }
    } 

这是用于DataGrid的XAML(第一列是:

<DataGrid.Columns>
          <DataGridTemplateColumn Header="Templates" 
                              Width="200" SortMemberPath='SortingName'>
            <DataGridTemplateColumn.CellTemplate>
              <DataTemplate DataType="{x:Type request:ModelDocument}">
                <TextBlock TextAlignment="Left">
                  <TextBlock.Style>
                    <Style TargetType="TextBlock">
                      <Setter Property="Text" Value="{Binding PrettyName}"/>
                    </Style>
                  </TextBlock.Style>
                </TextBlock>
              </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>

...remaining columns

我尝试为Binding使用SortMemberPath,并分配一个UpdateSourceTrigger=PropertyChanged,但似乎没有任何作用。我也尝试过this方法,但是对ItemsSource的定义方式有疑问。因此,我宁愿在点击时更新该属性。

1 个答案:

答案 0 :(得分:0)

为解决这个问题,我只是在自定义类中创建了一个扩展了DataGrid的函数,并将其添加到其Sorting事件处理程序中。

    public DataGridEx()
    {
       Sorting += UpdateSorting;
    }

UpdateSorting函数在字符串的开头附加一个ASCII字符,具体取决于我希望该项保留的顺序。在此示例中,我希望文件夹类型的项保留在顶部,因此当列表升序时,我添加一个低字母字符(例如!),反之亦然。这样,文件夹始终位于顶部。

在我看来,这不是最好的解决方案(老实说,它与问题本身并没有太大关系),但目前可以使用。如果有人有更好的答案,请随时发布!