7

在 WP8 中,他们忘记提供 SelectedItem 作为依赖属性,因此我无法绑定到它。我用这个解决了这个问题:http: //dotnet-redzone.blogspot.com/2012/11/windows-phone-8longlistselector.html

这样做时,我注意到我无法从 ViewModel 重置属性,即如果我在 ViewModel 中将项目设置为 null,它不会影响 UI。我已经在 UI 中提供了两种方式绑定,但仍然在 ViewModel 中将项目设置为 null 不会更改 LongListSelector 中的选定项目。我也不想使用 SelectionChanged 事件,因为我在 WP7.5 应用程序和 WP8 应用程序之间共享 ViewModel,因此我想尽可能多地推入 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

并且有这两部分的完整版:

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 回答