programing

XAML만 사용하고 코드 배후는 사용하지 않고 ListBox를 정렬하려면 어떻게 해야 합니까?

instargram 2023. 4. 17. 21:18
반응형

XAML만 사용하고 코드 배후는 사용하지 않고 ListBox를 정렬하려면 어떻게 해야 합니까?

스트링을 정렬할 필요가 있습니다.ListBox단, 다른 컴포넌트에 의해 뷰모델에 바인드 됩니다.DataContext따라서 XAML에서는 뷰 모델을 직접 인스턴스화할 수 없습니다.이 예에서는, 다음의 예를 사용하고 있습니다.ObjectDataProvider.

내 XAML:

<ListBox ItemsSource="{Binding CollectionOfStrings}" />

내 뷰 모델:

public ObservableCollection<string> CollectionOfStrings
{
    get { return collectionOfStrings; }
}

다른 컴포넌트:

view.DataContext = new ViewModel();

뒤에 코드는 없습니다!순수하게 XAML을 사용하는 경우 ListBox 내의 아이템을 어떻게 정렬해야 합니까?다시 말하지만 XAML은 뷰 모델의 인스턴스화를 소유하지 않습니다.

를 사용합니다.

<CollectionViewSource x:Key="SortedItems" Source="{Binding CollectionOfStrings}"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=Win‌​dowsBase">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="SomePropertyOnYourItems"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

<ListBox ItemsSource="{Binding Source={StaticResource SortedItems}}"/>

정렬 동작을 더 쉽게 적용할 수 있도록 사용자 지정 VM 클래스로 문자열을 줄 바꿈할 수 있습니다.

첨부된 속성이 코드 없음으로 인정될 경우 다음을 사용할 수 있습니다.

public static class Sort
{
    public static readonly DependencyProperty DirectionProperty = DependencyProperty.RegisterAttached(
        "Direction",
        typeof(ListSortDirection?),
        typeof(Sort),
        new PropertyMetadata(
            default(ListSortDirection?),
            OnDirectionChanged));

    [AttachedPropertyBrowsableForType(typeof(ItemsControl))]
    public static ListSortDirection? GetDirection(ItemsControl element)
    {
        return (ListSortDirection)element.GetValue(DirectionProperty);
    }

    public static void SetDirection(ItemsControl element, ListSortDirection? value)
    {
        element.SetValue(DirectionProperty, value);
    }

    private static void OnDirectionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is ItemsControl { Items: { } items })
        {
            if (e.NewValue is ListSortDirection direction)
            {
                items.SortDescriptions.Add(new SortDescription(string.Empty, direction));
            }
            else if (e.OldValue is ListSortDirection old &&
                     items.SortDescriptions.FirstOrDefault(x => x.Direction == old) is { } oldDescription)
            {
                items.SortDescriptions.Remove(oldDescription);
            }
        }
    }
}

그러면 xaml:

<ListBox local:Sort.Direction="Ascending"
         ... />

유형이 다른 연결된 속성입니다.SortDescription아마 많은 경우에 말이 되겠지요.

언급URL : https://stackoverflow.com/questions/1280704/how-can-i-sort-a-listbox-using-only-xaml-and-no-code-behind

반응형