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
列。
答案 0 :(得分:1)
将ViewModelBase继承替换为ObservableObject。 这是一个较轻的基类,但包含所有INotifyPropertyChange封装,但没有IsInDesign属性。