我在使用GalaSoft的RelayCommand时遇到一些问题。

我有一个有效的 NextCommand 属性,但只能运行几次。

之后,它将完全停止工作。

您可以通过示例项目进行尝试:

http://s000.tinyupload.com/?file_id=65828891881629261404

行为如下:

  • NextCommand :
  • 弹出所有项目,直到事件索引
  • 如果剩余少于50个项目,则推送1个新项目
  • 将新项目标记为事件
  • BackCommand :
  • 将事件索引后移1个位置

  • 复制步骤:
  • '+'(OemPlus)键已绑定(bind)到NextCommand
  • '-'(OemMinus)键已绑定(bind)到BackCommand
  • 按住“+”键,直到列表停止增长(限制50个项目)为止
  • 按住'-'键,直到列表中的第一项成为事件的
  • 重复

  • (复制错误)所需的重复次数不一致。

    有时候,我经过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中,您将NextCommandItemCollection设置为使用即将收集的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后,该命令将不再起作用,因为它不再引用有效方法(AddItemCanAddItem)。这就是为什么isAlive对方法的两个弱引用上的RelayCommand字段为false的原因。

    您可以通过仅卡在LogicObject上,或将AddItemCanAddItem方法移到集合中来解决此问题。

    为了使GIF具有这个问题的精神,以下是一个按钮,该按钮显示Gen 0收集发生后按钮就停止工作。

    关于c# - 一段时间后RelayCommand停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25868209/

    10-11 22:40
    查看更多