将可观察对象设置为NULL == CRASH

时间:2016-08-01 06:55:41

标签: wpf mvvm-light radgridview

我有一个绑定到(Telerik)GridView的List。所选项目是T类型的单独变量,当用户单击某一行时,该变量将在GridView中分配所选行的对象。 T来自ObservableObject 。这意味着我正在使用 MVVM Light Toolkit

在某些情况下,我需要取消选择ViewModel中的行。如果在ViewModel中将所选项目设置为NULL,则在GridView控件上可以正常工作。每当我这样做时,MVVM都会报告崩溃(NPE)。我调试它,发现它在ObservableObject.cs中失败了。它调用方法

    protected bool Set<T>(
        Expression<Func<T>> propertyExpression,
        ref T field,
        T newValue)

在调用RaisePropertyChanged(propertyExpression)

之前在返回之前崩溃了一行

我不知道这是否按设计工作。我的问题是,我需要在ViewModel中将所选Object设置为NULL,以在View中取消选择GridView的一行。 我不能使用CodeBehind进行取消选择

我的代码:

    public ObservableCollection<ContractTypeDto> ContractTypes { get; private set; }

    public ContractTypeDto SelectedContractType
    {
        get { return _selectedContractType; }
        set
        {
            Set(() => SelectedContractType, ref _selectedContractType, value);
            RaisePropertyChanged(() => SelectedContractType);
        }
    }

当您单击网格中的某一行时,它会打开一个新的UserControl,其中包含此记录的大量详细信息。此控件具有自己的ViewModel。我存储调用视图Model(存储所选项目的位置)。当页面(控件)关闭(销毁)时,我必须取消选择网格中的行。我称之为这样的方法:

    protected void DeselectCallersSelectedItem()
    {
        if (CallingObject == typeof(ContractTypeListViewModel))
        {
            var vm = SimpleIoc.Default.GetInstance<ContractTypeListViewModel>();
            vm.SelectedContractType = null;
        }
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

要删除集合,您可以将SelectedItem属性设置为null或清除SelectedItems

gridViewName.SelectedItem = null;
gridViewName.SelectedItems.Clear();

如果没有显示代码,我们无法准确地为您提供帮助。我认为您可以做的解决方案是在视图模型中实现INotifyPropertyChanged接口,并将所选项绑定到该类型的属性。如果有任何绑定失败,也请检查输出窗口。