我在使用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的代码时,执行 Action 的 isAlive 标志为false。但我似乎无法弄清楚这种情况如何发生。
最佳答案
两个词:垃圾收集器
在示例项目中(您应该发布其中的相关内容以使问题适应 future ),您可以在窗口中设置DataContext
,如下所示:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var logic = new LogicObject();
DataContext = logic.Collection;
}
}
由于没有其他任何东西保留对此处创建的
LogicObject
的引用,因此它将在下一次机会收集。该命令停止运行,因为在
LogicObject
中,您将NextCommand
的ItemCollection
设置为使用即将收集的LogicObject
的私有(private)成员: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
)。这就是为什么isAlive
对方法的两个弱引用上的RelayCommand
字段为false的原因。您可以通过仅卡在
LogicObject
上,或将AddItem
和CanAddItem
方法移到集合中来解决此问题。为了使GIF具有这个问题的精神,以下是一个按钮,该按钮显示Gen 0收集发生后按钮就停止工作。
关于c# - 一段时间后RelayCommand停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25868209/