5

ご挨拶、

バインドされたItemsSource内のすべてのオブジェクトのRadioButtonを表示するために変更したItemsControlがあります。

ただし、ItemsSourceは空にすることができ、空の場合はデフォルト値を表示したいと思います。「バインドされたリストには、選択できるアイテムが含まれていません」のようなもの...

私が考えた1つの方法は、ItemsControl.VisibilityをCollapsedに設定し、TextBlock.VsibilityをVisibleに設定して、テキストを表示することです。ただし、これにはさらに多くのデータが含まれます。

ItemsControl.ItemsSourceがnullの場合、デフォルト値を表示することはできますか?

4

4 に答える 4

4

この単純なコンバーターを作成した後:

public class AnyItemsToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = value as IEnumerable;
        if (collection == null)
            return Visibility.Collapsed;

        return collection.OfType<object>().Any() ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

RelativeSource バインディングを使用して、これをサポートするために ItemsControl テンプレートをオーバーライドできます。

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SilverlightApplication1">
    <UserControl.Resources>
        <local:AnyItemsToVisibilityConverter x:Key="AnyItemsToVisibilityConverter" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <ItemsControl>
            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <Grid>
                        <TextBlock Text="No Items to Display" 
Visibility="{Binding Items, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource AnyItemsToVisibilityConverter}}" />
                        <ItemsPresenter />
                    </Grid>
                </ControlTemplate>     
            </ItemsControl.Template>
        </ItemsControl>
    </Grid>
</UserControl>
于 2011-05-12T14:27:41.657 に答える
1

リストが空かどうかを示す Converter を作成しないでください。XAML、Converter、およびデータ ソースが完全に独立した項目である場合に適しています。MVVM は疎結合に関するものではありませんか?

OK、コードビハインドは悪です。ご指摘ありがとうございます。ソースコードを修正しました。現在は完全に宣言型です。

       <ControlTemplate x:Key="ListBoxTemplate" TargetType="ListBox">
            <StackPanel>
            <ItemsPresenter  
                 Visibility="{Binding Path=NotEmpty,
                Converter={StaticResource BoolToVisibilityConverter}}">
            </ItemsPresenter>
                <TextBlock Text="No items to select from" 
                 Visibility="{Binding Path=Empty,
                 Converter={StaticResource BoolToVisibilityConverter}}"/>
            </StackPanel>
        </ControlTemplate>

        <Style x:Key="ListBoxStyle2" TargetType="ListBox"  >
            <Setter Property="Template" Value="{StaticResource ListBoxTemplate}">
            </Setter>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>
于 2011-05-13T22:32:59.357 に答える
1

私の理解が正しければ、 を作成することで問題を解決できると思いますIValueConverter

于 2011-05-12T11:39:29.360 に答える
0

できることの 1 つは、チェックItemsControl.ItemsSourceが null の後に、単一の item を追加できること"The binded list contains no items for you to select"です。これがあなたの目的に役立つことを願っています。

于 2011-05-12T11:35:06.913 に答える