[英]RelayCommand stops working after a while
我使用GalaSoft的RelayCommand遇到了一些問題。
我有一個可以工作的NextCommand屬性,但只有幾次。
之后,它完全停止工作。
您可以使用示例項目嘗試此操作:
http://s000.tinyupload.com/?file_id=65828891881629261404
行為如下:
復制步驟:
所需的重復次數(復制錯誤)是不一致的。
有時我會在重復4次后得到它; 其他時間到9。
// Items Collection
public class ItemCollection : ViewModelBase
{
// List of Items
private readonly ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items
{
get { return _items; }
}
// Constructor
public ItemCollection()
{
BackCommand = new RelayCommand(
() =>
{
// Go to previous page
var index = Items.IndexOf(ActiveItem);
if (index > 0)
{
ActiveItem = Items[index - 1];
}
},
() => ActiveItem != null && Items.IndexOf(ActiveItem) > 0);
}
// Back command
public RelayCommand BackCommand { get; set; }
// Next command
public RelayCommand NextCommand { get; set; }
// The currently-active item
private Item _activeItem;
public Item ActiveItem
{
get { return _activeItem; }
set
{
Set(() => ActiveItem, ref _activeItem, value);
}
}
}
// Item
public class Item : ViewModelBase
{
public string Title { get; set; }
}
當我進入RelayCommand的代碼時,執行操作的isAlive標志為false。 但我似乎無法弄清楚這可能會如何發生。
兩個字: 垃圾收集器
在您的示例項目中 - 您應該發布相關的部分以使您的問題面向未來 - 您在窗口上設置DataContext
,如下所示:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var logic = new LogicObject();
DataContext = logic.Collection;
}
}
因為沒有別的東西保留對這里創建的LogicObject
的引用,所以它將在下一次機會時收集。
該命令停止運行,因為在LogicObject
,您將ItemCollection
的NextCommand
設置為使用即將收集的LogicObject
私有成員:
public class LogicObject
{
public LogicObject()
{
Collection = new ItemCollection();
Collection.NextCommand = new RelayCommand(AddItem, CanAddItem);
AddItem();
}
private bool CanAddItem()
{
// snip...
}
private void AddItem()
{
// snip...
}
}
收集LogicObject
,該命令將無法再運行,因為它不再引用有效方法( AddItem
和CanAddItem
)。 這就是為什么RelayCommand
對這些方法的弱引用的isAlive
字段都是錯誤的。
您可以通過掛起LogicObject
或將AddItem
和CanAddItem
方法移動到集合中來解決此問題。
為了獲得這個問題的GIF精神,這里有一個顯示按鈕在Gen 0收集發生時立即停止工作的問題。
為什么不簡單地使用ICollectionView中的方法? 你有:
這樣的事情
private ICollectionView MyView {get;set;}
this.MyView = CollectionViewSource.GetDefaultView(this._items);
if (!this.MyView.IsCurrentBeforeFirst)
{
this.MyView.MoveCurrentToPrevious();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.