我遇到了与以下帖子类似的问题:
Silverlight DataGridTextColumn Binding Visibility
我希望根据 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>
几个重要的事实。
- 转换器确实在本地资源中定义。
- 转换器是正确的,在解决方案的许多其他地方都被使用。
- 如果我用 "Collapsed" 替换 MyVisibility 属性的 {Binding} 语法,该列确实会消失。
- 如果我创建一个新的 DependencyProperty(例如 string Foo),并绑定它,我也会收到 AG_E_PARSER_BAD_PROPERTY_VALUE 异常。
有人对为什么这不起作用有任何想法吗?