我希望能夠單擊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