web-dev-qa-db-ja.com

基になるDataContextがnullの場合にコントロールを非表示にするにはどうすればよいですか?

ビューモデルに多数のプロパティを持つオブジェクトがありますが、そのうちのいくつかはnullになることがあります。これらの特定のコントロールがnullの場合、いくつかのコントロールを表示したくありません。バインドがnullの場合、コントロールを非表示にするにはどうすればよいですか?ある種のコンバーターを考えていたのですが、どうやって正確にやっていくのかわかりません。何か案は?

編集:申し訳ありませんが、これはSilverlightでも行われるため、スタイルトリガーが機能するかどうかはわかりません...?

23
Harry

次のようなコンバーターを持っている、

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>
26
Prince Ashitaka

このアプローチはより簡単です:

<CheckBox Visibility="{Binding Path=checkedField, TargetNullValue=Collapsed }">

バインドされたプロパティcheckedFieldがnullの場合、VisibilityはCollapsedに設定されます。

37
bugfixr

これは、WindowsPhoneWinRTアプリにも必要でした。 @ PrinceAshitakaのコンバーター を使用することになりましたが、 同様の質問に対するこの回答 で提案されているように、バインディングに小さな変更が加えられました。

Datacontextがnullの場合にコントロールが正確に表示されないようにするには、FallbackValue=Collapsedを使用する必要があります。 TargetNullValue=Collapsedがうまくいかなかった理由がわかりません。

Visibility="{Binding Converter={StaticResource NullToVisibilityConverter}, FallbackValue=Collapsed}"
5
Camilo Martinez

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>
3

DataContextChangedイベントを使用できます。DataContextがnullの場合、VisbilityをCollapsedに設定できます。

それについてもっと読む ここ

2
Mark

これが必要でしたが、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>