我有一个类似于以下帖子的问题:
Silverlight DataGridTextColumn 绑定可见性
我需要根据 ViewModel 中的值使 Silverlight DataGrid 中的列可见/折叠。为此,我尝试将 Visibility 属性绑定到 ViewModel。但是我很快发现 Visibility 属性不是 DependencyProperty,因此它不能被绑定。
为了解决这个问题,我尝试子类化我自己的 DataGridTextColumn。通过这个新类,我创建了一个 DependencyProperty,它最终将更改推送到 DataGridTextColumn.Visibility 属性。如果我不进行数据绑定,这很好用。当我将数据绑定到我的新属性时,它会失败,并出现 AG_E_PARSER_BAD_PROPERTY_VALUE 异常。
public class MyDataGridTextColumn : DataGridTextColumn
{
#region public Visibility MyVisibility
public static readonly DependencyProperty MyVisibilityProperty =
DependencyProperty.Register("MyVisibility", typeof(Visibility), typeof(MyDataGridTextColumn), new PropertyMetadata(Visibility.Visible, OnMyVisibilityPropertyChanged));
private static void OnMyVisibilityPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var @this = d as MyDataGridTextColumn;
if (@this != null)
{
@this.OnMyVisibilityChanged((Visibility)e.OldValue, (Visibility)e.NewValue);
}
}
private void OnMyVisibilityChanged(Visibility oldValue, Visibility newValue)
{
Visibility = newValue;
}
public Visibility MyVisibility
{
get { return (Visibility)GetValue(MyVisibilityProperty); }
set { SetValue(MyVisibilityProperty, value); }
}
#endregion public Visibility MyVisibility
}
这是 XAML 的一个小片段。
<DataGrid ....>
<DataGrid.Columns>
<MyDataGridTextColumn Header="User Name"
Foreground="#FFFFFFFF"
Binding="{Binding User.UserName}"
MinWidth="150"
CanUserSort="True"
CanUserResize="False"
CanUserReorder="True"
MyVisibility="{Binding Converter={StaticResource BoolToVisibilityConverter}, Path=ShouldShowUser}"/>
<DataGridTextColumn .../>
</DataGrid.Columns>
</DataGrid>
几个重要的事实。
- 转换器确实在上面的本地资源中定义。
- 转换器是正确的,它在解决方案中的许多其他地方使用。
- 如果我将 MyVisibility 属性的 {Binding} 语法替换为“Collapsed”,则 Column 实际上会消失。
- 如果我创建一个新的 DependencyProperty(即字符串 Foo)并绑定到它,我也会收到 AG_E_PARSER_BAD_PROPERTY_VALUE 异常。
有人对为什么这不起作用有任何想法吗?