【问题标题】:Setting observable object to NULL == CRASH将可观察对象设置为 NULL == CRASH
【发布时间】:2016-08-01 06:55:40
【问题描述】:

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

在某些情况下,我需要从 ViewModel 中取消选择该行。在 GridView 控件上,如果在 ViewModel 中将所选项目设置为 NULL,则此方法有效。每当我这样做时,MVVM 都会报告崩溃 (NPE)。我对其进行了调试,发现它在 ObservableObject.cs 中失败了。它调用一个方法

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

调用RaisePropertyChanged(propertyExpression)时在返回前崩溃一行

我不知道这是否按设计工作。我的问题是,我需要在 ViewModel 中将选定的对象设置为 NULL 以取消选择视图中我的 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。我存储调用视图模型(存储所选项目的位置)。当页面(控件)关闭(销毁)时,我必须取消选择网格中的行。我这样调用一个方法:

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

有什么想法吗?

【问题讨论】:

    标签: wpf mvvm-light radgridview


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经用附加信息更新了我的原始消息。我使用 MVVM Light 工具包。 ObservableObject 是这个工具包中的一个类,它实现了 INotifyPropertyChanged。当我将我的项目设置为 null MVVM 时,灯光会崩溃。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多