为什么FlipView会忽略SelectedItem

时间:2012-05-04 01:07:51

标签: xaml windows-runtime winrt-xaml

我想使用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>

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

这是故意的吗?还是一个错误?

4 个答案:

答案 0 :(得分:10)

试试这个

<FlipView
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
  • 您的SelectedItem需要是一个TwoWay绑定才能工作,因为该值由控件和视图模型设置。

答案 1 :(得分:5)

与FlipView存在相同的问题,无法使BindableBase或TwoWay选项生效。因为列表的顺序对我来说不是一个主题,所以我创建了一个重新排序ItemsSource的方法,从SelectedItem开始作为Collection中的第一个项目。

在底层代码中,结果是FlipView的新ItemsSource,而不是之前的List元素。

    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;
    }

答案 2 :(得分:1)

除了Filip所说的,你的类(MyDataContext)需要通知UI该属性已经改变。您的ViewModel必须实现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); }
    }
}

答案 3 :(得分:0)

这看起来像个bug。 如果您调试代码,您会注意到,首先VM中的SelectedItem设置为正确的元素,然后它设置为null,然后设置为FlipView的ItemsSource集合的第一个元素。

作为一种解决方法,我看到在引发FlipView的Loaded事件后设置VM的SelectedItem。