MvvmLight - 隐藏DataGrid中的IsInDesignMode

时间:2015-05-07 06:53:17

标签: wpf mvvm datagrid mvvm-light

MvvmLight' ViewModelBase类型的属性IsInDesignMode由所有子类继承。

我的MainWindow ViewModel类似于:

class MainWindowViewModel : ViewModelBase {

    ObservableCollection<PersonViewModel> People { get; }
}

class PersonViewModel : ViewModelBase {
}

我的DataGrid的XAML正是这样:

<DataGrid ItemsSource="{Binding Path=People}" />`

当我运行该应用程序时,我会看到我的所有PersonViewModel属性,但IsInDesignMode作为其中一列。这是不可取的。

我还有另一个ViewModel代表另一个实体ProductViewModel,它通过属性ObservableCollection<Pair<String,String>>具有可扩展属性,其中每个Pair<String,String>条目代表一个额外的列名称,它的价值分别为。

非工作解决方案:

要解决IsInDesignMode问题,我实施了PersonViewModel : ICustomTypeDescriptor,并在GetProperties方法中删除了IsInDesignMode属性,但是当DataGrid呈现我的集合时,它仍然具有柱。我在GetProperties设置了一个断点并且正在调用它,所以我不知道为什么WPF不尊重结果。

class PersonViewModel : ViewModelBase, ICustomTypeDescriptor {
    PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
    {
        return new PropertyDescriptorCollection(
            TypeDescriptor.GetProperties( this, attributes, true ).Where( pd => pd.Name != "IsInDesignMode" )
        );
    }
}

我还将ObservableCollection<PersonViewModel> People更改为TypedListObservableCollection<PersonViewModel>,这是一个具有此定义的类:

public class TypedListObservableCollection<T> : ObservableCollection<T>, ITypedList
{
    public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
    {
       return TypeDescriptor.GetProperties( typeof(T));
    }

...但是,这并不会导致WPF尊重我的逻辑并隐藏IsInDesignMode列。

1 个答案:

答案 0 :(得分:1)

将ViewModelBase继承替换为ObservableObject。 这是一个较轻的基类,但包含所有INotifyPropertyChange封装,但没有IsInDesign属性。