次の投稿のような問題があります。
Silverlight DataGridTextColumn バインディングの可視性
ViewModel 内の値に基づいて、Silverlight DataGrid 内の列を表示/折りたたむ必要があります。これを達成するために、Visibility プロパティを ViewModel にバインドしようとしています。しかし、Visibility プロパティは DependencyProperty ではないため、バインドできないことがすぐにわかりました。
これを解決するために、独自の DataGridTextColumn をサブクラス化しようとしました。この新しいクラスを使用して、最終的に変更を DataGridTextColumn.Visibility プロパティにプッシュする DependencyProperty を作成しました。データバインドしない場合、これはうまく機能します。新しいプロパティにデータバインドした瞬間、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>
いくつかの重要な事実。
- Converter は、実際には上記のローカル リソースで定義されています。
- コンバーターは正しく、ソリューションの他の多くの場所で使用されています。
- MyVisibility プロパティの {Binding} 構文を「Collapsed」に置き換えると、列は実際には消えます。
- 新しい DependencyProperty (つまり、文字列 Foo) を作成し、それにバインドすると、AG_E_PARSER_BAD_PROPERTY_VALUE 例外も受け取ります。
なぜこれが機能しないのか、誰にもアイデアはありますか?