2013-03-05 11 views
7

W WP8 zapomnieli podać SelectedItem jako właściwość zależności, dlatego nie jestem w stanie powiązać go. Naprawiłem to, używając tego: http://dotnet-redzone.blogspot.com/2012/11/windows-phone-8longlistselector.htmlWP8 LongListSelector SelectedItem nie można powiązać

Robiąc to, zauważam, że nie jestem w stanie zresetować właściwości z ViewModel, tzn. Jeśli ustawię element na wartość null w ViewModelu, nie ma to wpływu na Interfejs użytkownika. Podałem już dwukierunkowe powiązanie w interfejsie użytkownika, ale wciąż ustawienie pozycji na wartość null w narzędziu ViewModel nie zmienia wybranego elementu w elemencie LongListSelector. Nie chcę również używać zdarzenia SelectionChanged podczas udostępniania ViewModels między aplikacją WP7.5 a aplikacją WP8, dlatego chcę wepchnąć jak najwięcej do ViewModel. Czy jest na to jakieś rozwiązanie?

+0

Korzystanie zdarzenie kranu na każdym z elementów będzie bardziej niezawodny niż próby uzyskać Selected ... do pracy. –

Odpowiedz

11

Wygląda na to, że niestandardowa klasa LongListSelector, której używasz, nie obsługuje poprawnie setera.

Wymień OnSelectedItemChanged zwrotnego z poniższym:

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

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

I jest pełna wersja tych dwóch części:

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); } 
    } 
} 
+0

Dla potomności :) –

Powiązane problemy