[英]ListBox selected items not updated when the context menu opens
我的WPF應用程序有一個列表框,其中包含很多項。 當用戶用鼠標右鍵單擊一個項目以打開上下文菜單時,我需要評估當前選擇的項目以構建菜單項標題,該標題告訴用戶此命令會發生什么。
此命令將在項目上設置過濾器,並應預先指示結果過濾器,該過濾器基於所選項目中的數據。
由於我不知道通過MVVM將ListBox的選定項放入視圖模型的任何方法,因此我在后面添加了代碼。 SelectionChanged事件處理程序將選定的項目發送到視圖模型。
不幸的是,當用戶單擊速度足夠快時,此選定項目列表已過時。 我經常看到以前的選擇,而不是當前的選擇。 僅當我按住鼠標右鍵足夠長的時間時,選擇才是最新的。
這是我的測試應用程序的屏幕截圖(如下):
問:如何才能可靠地獲取上下文菜單標題的當前選擇?
我做了一個非常簡單的測試用例,因此您可以重現該問題。 轉換器的延遲很短,可以模擬活動。 我的實際轉換器沒有此延遲,但是由於視圖更加復雜,因此加載UI花費的時間也很短,效果相同。
這是代碼: https : //drive.google.com/file/d/0B8CN0ghdY1SdTW9Ka1lHc1dIUFk/edit
將您的ViewModel更新為此
internal class MainViewModel : INotifyPropertyChanged
{
private List<string> _selectedItems;
public MainViewModel()
{
MenuCommand = new MenuCommand();
StringItems = new List<string>();
StringItems.Add("Hello");
StringItems.Add("world");
StringItems.Add("of");
StringItems.Add("mysterious");
StringItems.Add("WPF");
}
public List<string> StringItems { get; set; }
public MenuCommand MenuCommand { get; private set; }
public string MenuCommandTitle
{
get { return "Selected items: " + SelectedItems.Aggregate((a, b) => a + ", " + b); }
}
public List<string> SelectedItems
{
get { return _selectedItems; }
set
{
_selectedItems = value;
OnPropertyChanged("MenuCommandTitle");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
您想要更新ContextMenu的綁定,以將新值通知UI。
OnPropertyChanged("MenuCommandTitle");
看來您的MainViewModel沒有實現INotifyPropertyChanged,所以您的MenuCommandTitle屬性並不總是更新。 當您在后台代碼中更新SelectedItems
時,您將需要觸發屬性更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.