ビューモデルに多数のプロパティを持つオブジェクトがありますが、そのうちのいくつかはnullになることがあります。これらの特定のコントロールがnullの場合、いくつかのコントロールを表示したくありません。バインドがnullの場合、コントロールを非表示にするにはどうすればよいですか?ある種のコンバーターを考えていたのですが、どうやって正確にやっていくのかわかりません。何か案は?
編集:申し訳ありませんが、これはSilverlightでも行われるため、スタイルトリガーが機能するかどうかはわかりません...?
次のようなコンバーターを持っている、
public sealed class NullToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? Visibility.Hidden: Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
ここで、プロパティをVisibilityプロパティにもバインドします。お気に入り、
<ListBox ItemsSource="{Binding Path=Squad}"
Visibility="{Binding Converter={StaticResource nullToVisibilityConverter},
Path=Squad}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
このアプローチはより簡単です:
<CheckBox Visibility="{Binding Path=checkedField, TargetNullValue=Collapsed }">
バインドされたプロパティcheckedField
がnullの場合、VisibilityはCollapsedに設定されます。
これは、WindowsPhoneWinRTアプリにも必要でした。 @ PrinceAshitakaのコンバーター を使用することになりましたが、 同様の質問に対するこの回答 で提案されているように、バインディングに小さな変更が加えられました。
Datacontextがnullの場合にコントロールが正確に表示されないようにするには、FallbackValue=Collapsed
を使用する必要があります。 TargetNullValue=Collapsed
がうまくいかなかった理由がわかりません。
Visibility="{Binding Converter={StaticResource NullToVisibilityConverter}, FallbackValue=Collapsed}"
Silverlightでは、次のアプローチを使用できます-制御にトリガーを追加します。
<i:Interaction.Triggers>
<core:DataTrigger Binding="{Binding SomeProperty}" Comparison="Equal" Value="{x:Null}">
<core:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</core:DataTrigger>
</i:Interaction.Triggers>
DataContextChanged
イベントを使用できます。DataContextがnullの場合、VisbilityをCollapsed
に設定できます。
それについてもっと読む ここ
これが必要でしたが、DataGridTemplateColumn内のDataTemplate内で機能させることができなかったので、これがどのように機能するかの例です。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=DataContext.AvailableHierarchies,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ItemsControl}} }"
DisplayMemberPath="Name"
SelectedItem="{Binding Path=DataContext.SelectedHierarchy,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ItemsControl}},UpdateSourceTrigger=PropertyChanged }"
>
<ComboBox.Style>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Style.Triggers>
<Trigger Property="ComboBox.ItemsSource" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>