Windows Phone 8.1 MVVM Light Dispose视图

时间:2014-09-02 08:14:32

标签: mvvm-light windows-phone-8.1

我正在开发使用MVVM Light的WP8.1应用程序。基本上它工作正常。除了导航的奇怪行为。我在VM中有一个命令,该命令绑定到列表的selectionChanged事件:

        private void GoToTransactionList()
        {
            if (SelectedAccount != null)
            {
                ((Frame)Window.Current.Content).Navigate(typeof(TransactionList));
            }
        }

View没有任何代码,整个内容都在用户控件上。 这是VM:

public class TransactionListUserControlViewModel : ViewModelBase
{
    private Account SelectedAccount
    {
        get { return ServiceLocator.Current.GetInstance<AccountDataAccess>().SelectedAccount; }
    }

    public ObservableCollection<FinancialTransaction> RelatedTransactions
    {
        get { return ServiceLocator.Current.GetInstance<TransactionDataAccess>().RelatedTransactions; }
    }

    public RelayCommand LoadRelatedTransactionsCommand { get; private set; }

    public TransactionListUserControlViewModel()
    {
        LoadRelatedTransactionsCommand = new RelayCommand(LoadRelatedTransactions);
    }

    private void LoadRelatedTransactions()
    {
        ServiceLocator.Current.GetInstance<TransactionDataAccess>().GetRelatedTransactions(SelectedAccount.Id);
    }

    public void Dispose()
    {
        this.Cleanup();
    }
}

我的定位器看起来像这样:

public TransactionListUserControlViewModel TransactionListControl
{
   get { return new TransactionListUserControlViewModel(); }
}

或者:

public TransactionListUserControlViewModel TransactionListControl
{
    get { return ServiceLocator.Current.GetInstance<TransactionListUserControlViewModel>(); }
}

我试过了两个。但是不要改变这种行为。

现在,我第一次导航到List,我必须单击后退按钮一次导航回来。如果我再次浏览页面,我必须单击两次,依此类推。换句话说,View不会被处理,但是每次我导航到视图时都会生成一个新的obect。我认为这取决于虚拟机上缺少的东西。

为了更好地概述,我在这里添加了github Repo的链接。

谁能告诉我我忘记了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我发现了这个错误。它是由我的UserControl中的绑定引起的。因此,当您向后导航时,它会再次设置该值并再次导航,直到该值设置为null(总是在x次之后,x是到页面的导航次数^^)。

使用selectedItem的单独变量修复它并在navigationCommand中使用它:

    private void GoToTransactionList()
    {
        if (SelectedItem != null)
        {
            SelectedAccount = SelectedItem;
            ((Frame)Window.Current.Content).Navigate(typeof(TransactionList));
            SelectedItem = null;
        }
    }