WP8 LongListSelector SelectedItem не привязывается

В WP8 они забыли предоставить SelectedItem в качестве свойства зависимостей, поэтому я не могу привязаться к нему. Я исправил это, используя это: http://dotnet-redzone.blogspot.com/2012/11/windows-phone-8longlistselector.html

При этом я замечаю, что не могу сбросить свойство из ViewModel, т. Е. Если я установлю элемент равным нулю в ViewModel, это не повлияет на пользовательский интерфейс. Я уже предоставил двухстороннюю привязку в пользовательском интерфейсе, но все еще установка нулевого элемента в ViewModel не изменяет выбранный элемент в LongListSelector. Я также не хочу использовать событие SelectionChanged, так как я делюсь ViewModel между приложением WP7.5 и приложением WP8, поэтому я хочу вытолкнуть как можно больше в ViewModel. Есть ли решение для этого?

2 ответа

Решение

Похоже, что используемый вами класс LongListSelector не обрабатывает сеттер должным образом.

Замените обратный вызов OnSelectedItemChanged следующим текстом:

    private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var selector = (LongListSelector)d;
        selector.SetSelectedItem(e);
    }

    private void SetSelectedItem(DependencyPropertyChangedEventArgs e)
    {
        base.SelectedItem = e.NewValue;
    }

И есть полная версия этих двух частей:

public class LongListSelector : Microsoft.Phone.Controls.LongListSelector
    {
        public LongListSelector()
        {
            SelectionChanged += LongListSelector_SelectionChanged;
        }

    void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedItem = base.SelectedItem;
    }

    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register(
            "SelectedItem",
            typeof(object),
            typeof(LongListSelector),
            new PropertyMetadata(null, OnSelectedItemChanged)
        );

    private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var selector = (LongListSelector)d;
        selector.SetSelectedItem(e);
    }

    private void SetSelectedItem(DependencyPropertyChangedEventArgs e)
    {
        base.SelectedItem = e.NewValue;
    }

    public new object SelectedItem
    {
        get { return GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }
}
Другие вопросы по тегам