我想使用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>
然而,当我运行应用程序时,翻转视图显示第一个项目,而不是第二个项目。
这是故意的吗?还是一个错误?
答案 0 :(得分:10)
试试这个
<FlipView
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=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。