7

WP8では、SelectedItemを依存関係プロパティとして提供するのを忘れていたため、バインドできません。これを使用して修正しました:http://dotnet-redzone.blogspot.com/2012/11/windows-phone-8longlistselector.html

そうすると、ViewModelからプロパティをリセットできないことに気付きます。つまり、ViewModelでアイテムをnullに設定しても、UIには影響しません。UIで双方向バインディングをすでに提供していますが、ViewModelでアイテムをnullに設定しても、LongListSelectorで選択されたアイテムは変更されません。また、WP7.5アプリとWP8アプリの間でViewModelを共有しているため、SelectionChangedイベントを使用したくないので、ViewModelにできるだけ多くプッシュしたいと思います。これに対する解決策はありますか?

4

2 に答える 2

11

使用しているカスタム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;
    }
于 2013-03-06T05:44:00.817 に答える
2

そして、これら2つの部分の完全版があります。

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); }
    }
}
于 2014-07-15T20:30:31.090 に答える