我想用一个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>
然而,当我运行应用程序,翻转视图显示的第一个项目,而不是第二个项目。
这是故意的?或者是一个错误吗?
尝试这个
<FlipView
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
- 您的SelectedItem必须是一个双向绑定为它工作,因为值由控制和视图模型均设置。
为具有与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;
}
在什么菲利普说顶部,你的类(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); }
}
}
它看起来像一个bug。 如果您调试代码,你会发现,在你第一次SelectedItem
在虚拟机设置为正确的元素,然后将其设置为null
,之后将其设置为FlipView的的ItemsSource集合的第一个元素。
作为一种变通方法我看FlipView的Loaded事件引发之后设置虚拟机的SelectedItem。