为什么FlipView忽视的SelectedItem(Why does FlipView ignor

2019-09-17 00:58发布

我想用一个FlipView显示一些项目,并开始呈现出特定项目。

对于这一点,我已经定义了一个视图模型类:

class MyDataContext
{

    public MyDataContext()
    {
        Items = new List<MyClass>();
        Items.Add(new MyClass("1"));
        Items.Add(new MyClass("2"));
        Items.Add(new MyClass("3"));
        SelectedItem = Items[1];
    }

    public List<MyClass> Items { get; set; }
    public MyClass SelectedItem { get; set; }
}

正如你所看到的,所选择的项目是不是第一个项目。

现在的XAML:

    <FlipView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"></FlipView>

然而,当我运行应用程序,翻转视图显示的第一个项目,而不是第二个项目。

这是故意的?或者是一个错误吗?

Answer 1:

尝试这个

<FlipView
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
  • 您的SelectedItem必须是一个双向绑定为它工作,因为值由控制和视图模型均设置。


Answer 2:

为具有与FlipView了同样的问题,无法获得BindableBase或双向选择工作。 由于该列表的顺序是不是一个真正的话题对我来说,我已经创建了重新排序的ItemsSource,用的SelectedItem为在集合中的第一项开始的方法。

在底层代码,结果是为FlipView新的ItemsSource,而不是以前的列表元素。

    public static List<T> ReorderList(List<T> elements, T selectedElement)
    {
        var elementIndex = elements.FindIndex(x => x.Id == selectedElement.Id);
        var result = new List<T>();

        foreach (var item in elements)
        {
            if (elementIndex .Equals(elements.Count))
            {
                elementIndex = 0;
            }

            result.Add(elements[elementIndex]);

            elementIndex++;
        }

        return result;
    }


Answer 3:

在什么菲利普说顶部,你的类(MyDataContext)需要通知该属性已经改变了UI。 您的视图模型必须执行INotifyPropertyChanged和属性需要火PropertyChanged事件

public class ViewModel : INotifyPropertyChanged
{
    private object _selectedItem;

    public object SelectedItem
    {
        get { return _selectedItem; }
        set 
        { 
            _selectedItem = value; 
            OnPropertyChanged("SelectedItem"); 
        }
    }
}

您还可以使用附带的示例应用程序的BindableBase类

public class ViewModel : BindableBase
{
    private object _selectedItem;

    public object SelectedItem
    {
        get { return this._selectedItem; }
        set { this.SetProperty(ref this._selectedItem, value); }
    }
}


Answer 4:

它看起来像一个bug。 如果您调试代码,你会发现,在你第一次SelectedItem在虚拟机设置为正确的元素,然后将其设置为null ,之后将其设置为FlipView的的ItemsSource集合的第一个元素。

作为一种变通方法我看FlipView的Loaded事件引发之后设置虚拟机的SelectedItem。



文章来源: Why does FlipView ignore SelectedItem