簡體   English   中英

一段時間后,RelayCommand停止工作

[英]RelayCommand stops working after a while

我使用GalaSoft的RelayCommand遇到了一些問題。

我有一個可以工作的NextCommand屬性,但只有幾次。

之后,它完全停止工作。

您可以使用示例項目嘗試此操作:

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

行為如下:

  1. NextCommand
    1. 彈出所有項目直到活動索引
    2. 如果剩下少於50個項目,則推送1個新項目
    3. 將新項目標記為活動
  2. BackCommand
    1. 將活動索引向后移動1個位置

復制步驟:

  1. '+'(OemPlus)鍵已綁定到NextCommand
  2. ' - '(OemMinus)鍵已綁定到BackCommand
  3. 按住“+”鍵直到列表停止增長(限制50個項目)
  4. 按住“ - ”鍵,直到列表中的第一項處於活動狀態
  5. 重復

所需的重復次數(復制錯誤)是不一致的。

有時我會在重復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 ,您將ItemCollectionNextCommand設置為使用即將收集的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字段都是錯誤的。

您可以通過掛起LogicObject或將AddItemCanAddItem方法移動到集合中來解決此問題。


為了獲得這個問題的GIF精神,這里有一個顯示按鈕在Gen 0收集發生時立即停止工作的問題。

GC發生時桌面捕獲顯示按鈕失敗

為什么不簡單地使用ICollectionView中的方法? 你有:

  • MoveCurrentTo
  • MoveCurrentToFirst
  • MoveCurrentToLast
  • MoveCurrentToNext
  • MoveCurrentToPrevious
  • 和其他好東西

這樣的事情

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM