У меня проблема, похожая на следующую запись:
Silverlight DataGridTextColumn Binding Visibility
Мне нужно, чтобы столбец в Silverlight DataGrid был виден/свернут на основе значения в ViewModel. Для этого я пытаюсь привязать свойство видимости к 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>
Несколько важных фактов.
- Конвертер действительно определен выше в локальных ресурсах.
- Конвертер верен, он используется во многих других местах в решении.
- Если я заменил синтаксис {Binding} свойства MyVisibility на "Collapsed", столбец действительно исчезнет.
- Если я создаю новый DependencyProperty (т.е. строку Foo) и привяжу к нему, я получаю также исключение AG_E_PARSER_BAD_PROPERTY_VALUE.
Есть ли у кого-нибудь идеи, почему это не работает?