Как связать DataGridColumn.Visibility?

У меня есть проблема, похожая на следующий пост:

Видимость привязки Silverlight DataGridTextColumn

Мне нужно, чтобы столбец в DataGrid Silverlight был видимым / свернутым на основе значения в ViewModel. Для этого я пытаюсь привязать свойство Visibility к ViewModel. Однако вскоре я обнаружил, что свойство Visibility не является DependencyProperty, поэтому оно не может быть связано.

Чтобы решить эту проблему, я попытался создать подкласс своего собственного DataGridTextColumn. С помощью этого нового класса я создал объект DependencyProperty, который в конечном итоге вносит изменения в свойство DataGridTextColumn.Visibility. Это хорошо работает, если я не привязываю данные. В тот момент, когда я связываю данные с моим новым свойством, оно перестает работать, за исключением AG_E_PARSER_BAD_PROPERTY_VALUE.

<code>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
}
</code>

Вот небольшой фрагмент XAML.

<code><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>
</code>

A couple important facts.

The Converter is indeed defined above in the local resources. The Converter is correct, it is used many other places in the solution. If I replace the {Binding} syntax for the MyVisibility property with "Collapsed" the Column does in fact disappear. If I create a new DependencyProperty (i.e. string Foo), and bind to it I receive the AG_E_PARSER_BAD_PROPERTY_VALUE exception too.

У кого-нибудь есть идеи относительно того, почему это не работает?

Ответы на вопрос(9)

Ваш ответ на вопрос