当用户单击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的方法。
<DataGridTextColumn
Header="Product Code"
Binding="{Binding ProductCode}"/>
<DataGridTextColumn
Header="Product Code"
Binding="{Binding Path=(entities:ProductXref.ProductCode)}" />
在#1中,设计人员说它无法解析该属性,并且没有IntelliSense,但可以在运行时运行。在#2中,属性已解析,并且具有IntelliSense。
问题是我不能总是控制使用哪种Binding方法,因此我必须照顾到这两种情况,从而导致上面的if
语句很黑。我需要为单击的列获取PropertyInfo,为此,我需要绑定的属性名称。
这是必须的方式还是有更整洁的方法?我正在使用MVVM Light。