gpt4 book ai didi

c# - RelayCommand 在一段时间后停止工作

转载 作者:可可西里 更新时间:2023-11-01 09:05:12 25 4
gpt4 key购买 nike

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

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

之后,它就完全停止工作了。

您可以使用示例项目进行尝试:

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

行为如下:

  1. 下一个命令:
    1. 弹出所有项目直到事件索引
    2. 如果剩余的元素少于 50 件,则推送 1 件新元素
    3. 将新项目标记为事件
  2. 后退命令:
    1. 将事件索引向后移动 1 个位置

复制步骤:

  1. '+' (OemPlus) 键已绑定(bind)到 NextCommand
  2. '-' (OemMinus) 键已绑定(bind)到 BackCommand
  3. 按住“+”键直到列表停止增长(最多 50 个项目)
  4. 按住“-”键直到列表中的第一项处于事件状态
  5. 重复

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

有时我会在重复 4 次后得到它;其他时间到 9 点。

enter image description here

// 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 标志为假。但我似乎无法弄清楚这是怎么发生的。

最佳答案

两个词:垃圾收集器

在您的示例项目中——您应该发布相关部分以使您的问题永不过时——您在窗口中设置 DataContext,如下所示:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

var logic = new LogicObject();
DataContext = logic.Collection;
}
}

因为没有其他东西保留对此处创建的 LogicObject 的引用,所以将在下一次机会时收集它。

该命令停止运行,因为在 LogicObject 中,您将 ItemCollectionNextCommand 设置为使用即将成为对象的私有(private)成员-收集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 后,该命令将不再有效,因为它不再引用有效方法(AddItemCanAddItem)。这就是为什么 RelayCommand 对方法的弱引用中的 isAlive 字段为 false 的原因。

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


为了理解这个问题的 GIF 精神,这里有一个显示按钮在第 0 代收集发生后立即停止工作的动图。

Desktop capture showing button failing when GC occurs

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com