我希望能够单击ListView项目,然后将我带到适当的页面。但是由于ClickedItem
与ItemClick
一样不存在,所以我必须使用SelectedItem
(获取用户点击的对象)和SelectionChanged
来捕获它(因为这是以某种方式设置的当用户点击时,他做出选择,这触发了这一点)。无法取消选择MVVM UWP中的ListView项目
由于在MVVM中我不能使用事件,我绑定了什么是事件,我的ViewModel中的方法。
<GridView x:Name="MyGrid"
ItemsSource="{x:Bind ViewModel.myList, Mode=OneWay}"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
IsSwipeEnabled="false"
SelectedItem="{Binding mySelectedItem, Mode=TwoWay}" // Binding makes it easier to bind the whole object
SelectionChanged="{x:Bind ViewModel.SelectioMade}"
>
我在ViewModel中填充我的列表。我正在使用INotifyPropertyChanged的Template10实现。
private MyListItemClass _mySelectedItem;
public MyListItemClass mySelectedItem{
get { return _mySelectedItem; }
set { Set(ref _mySelectedItem, value); }
}
而这个简单的方法将我推到下一个页面,当用户点击一个项目。
public void SelectioMade() {
if (_mySelectedItem != null) {
NavigationService.Navigate(typeof(Views.DetailPage), _mySelectedItem.id);
}
}
This Works。
问题在于选择已完成并且仍然存在。当我点击DetailPage
上的后退按钮时,当我离开它并且点击的项目仍然被选中时,我回到这个列表。因此,再次单击它实际上不会进行选择并触发SelectionChanged
。
当我不再需要该值时,明显的选择似乎是将mySelectedItem
设置为null
,但它不起作用。
public void SelectioMade() {
if (_mySelectedItem != null) {
NavigationService.Navigate(typeof(Views.DetailPage), _mySelectedItem.id);
mySelectedItem = null;
}
}
我似乎无法将其设置回null
。如果我在mySelectedItem = null;
上放置一个断点,它就不会做任何事情。它会触发set { Set(ref _mySelectedItem, value); }
,但视图不会更新。被单击的项目不会被取消选择,也不会被绑定到mySelectedItem.id
属性之一的TextBlock被更改(或更确切地说,被清空)。
我想知道为什么不这样做,并可能如何解决它。我的MVVM可能不完美,我仍然在学习。虽然它可能不完美,但我并不真正在寻找如何正确编写MVVM的建议。我想知道为什么这不起作用,因为在我看来,它应该工作得很好。
我不知道/意识到,我可以用这种方式来绑定事件(第一个例子)。这真的很好知道(分享没有人提到过我)。我虽然这样绑定一个方法,但我无法访问这些数据。在这种情况下,它会做得很好,尽管我可能最终需要实现一些EventToCommand事情。非常感谢! – rancor1223