2

ItemsControl に表示したい項目のコレクションがあります。これらの各アイテムには、各アイテム内に水平に表示されるサブアイテムのコレクションがあります。私の質問は、XAML でサブ項目を並べ替えるにはどうすればよいですか? 通常は CollectionViewSource を使用しますが、この場合は機能しません。以下に簡単な例を示します。この場合、somedata はアイテム (文字列) のコレクションであり、アイテムは文字のコレクションです。各行にすべての文字がソートされるように、この例を変更したいと思います。

これはウィンドウのコンストラクターです。

        string[] somedata = new string[] { "afkhsdfgjh", "fsdkgjhsdfjh", "sdfjhdfsjh" };
        mainList.ItemsSource = somedata;

そして、これは XAML として (ウィンドウ タグ内)

<ItemsControl Name="mainList">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding}" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Margin" Value="0,0,5,0"></Setter>
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
4

2 に答える 2

1

サブアイテムにも CollectionViewSource を使用できます。サンプル ビュー モデルは次のとおりです。

public class Item : ViewModel
{
    public String Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    private String name;

    public ObservableCollection<String> SubItems
    {
        get
        {
            return subItems ?? (subItems = new ObservableCollection<String>());
        }
    }
    private ObservableCollection<String> subItems;
}

...そしてマークアップ:

<ListBox ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <StackPanel.Resources>
                    <CollectionViewSource Source="{Binding SubItems}" x:Key="subItemsViewSource">
                        <CollectionViewSource.SortDescriptions>
                            <scm:SortDescription Direction="Ascending" />
                        </CollectionViewSource.SortDescriptions>
                    </CollectionViewSource>
                </StackPanel.Resources>
                <TextBlock Text="{Binding Name}" />
                <ListBox ItemsSource="{Binding Source={StaticResource subItemsViewSource}}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal"></StackPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>    

コード ビハインドでは、いくつかのデータを使用してデータ コンテキストを初期化します。

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ObservableCollection<Item>
        {
            new Item
            {
                Name = "John",
                SubItems = 
                {
                    "Mary", "Peter", "James"
                },
            },
            new Item
            {
                Name = "Homer",
                SubItems = 
                {
                    "Lisa", "Bart", "Marge"
                },
            }
        };
    }

CollectionViewSource を記述するリソースを、マスター リスト アイテムのレイアウト コントロールのリソースに入れるのがコツです。

于 2012-05-30T06:14:19.653 に答える
0

内側のItemsControlで値コンバーターを使用できます。コンバーターは、並べ替えられた配列を返すだけです。

public class ArraySortConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && value is string)
        {
            return new string((value as string).OrderBy(ch => ch).ToArray());
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Cannot convert back");
    }
}

実際にコンバーターを使用できるようにするには、次のようなItemsControl.ItemTemplateも追加する必要があると思います。

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <ContentPresenter Content="{Binding Converter={StaticResource ArraySorter}}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>
于 2012-05-30T05:34:56.543 に答える