DataGrid标头请点击

时间:2019-02-18 18:08:45

标签: c# wpf datagrid

当用户单击DataGridTextColumn的标题时,我想获取绑定属性的PropertyInfo。我正在使用一种样式,该样式具有带有ToggleButton的控件模板以指定单击处理程序。

<ToggleButton
    Command="{Binding ClickHandler, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
    CommandParameter="{Binding RelativeSource={RelativeSource Self}}">
</ToggleButton>

这通过RelayCommand ColumnHeaderClick调用ClickHandler

private void ColumnHeaderClick(ToggleButton button)
{
    string columnName = this.GetColumnBindingName(button);
}

private string GetColumnBindingName(FrameworkElement element)
{
    var column = this.GetColumnByHeader((string) element.DataContext);

    switch (column)
    {
        case DataGridTextColumn textColumn:
        {
           var binding = (Binding) textColumn.Binding;
           PropertyPath path = binding.Path;

           // This is the part that concerns me
           if (path.PathParameters.Count == 0)
           {
               return path.Path;
           }
           else
           {
               var info = (PropertyInfo) path.PathParameters[0];
               return info.Name;
            }
        }

        default:
            throw new NotImplementedException("Only DataGridTextColumns are supported");
    }
}

这里有注释的if语句,因为在列定义中有两种指定Binding的方法。

1。

<DataGridTextColumn 
    Header="Product Code"
    Binding="{Binding ProductCode}"/>

2。

<DataGridTextColumn 
    Header="Product Code"
    Binding="{Binding Path=(entities:ProductXref.ProductCode)}" />

在#1中,设计人员说它无法解析该属性,并且没有IntelliSense,但可以在运行时运行。在#2中,属性已解析,并且具有IntelliSense。

问题

问题是我不能总是控制使用哪种Binding方法,因此我必须照顾到这两种情况,从而导致上面的if语句很黑。我需要为单击的列获取PropertyInfo,为此,我需要绑定的属性名称。

这是必须的方式还是有更整洁的方法?我正在使用MVVM Light。

0 个答案:

没有答案