gpt4 book ai didi

wpf - MvvmLight-在DataGrid中隐藏IsInDesignMode

转载 作者:行者123 更新时间:2023-12-03 10:27:51 25 4
gpt4 key购买 nike

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列。

最佳答案

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

关于wpf - MvvmLight-在DataGrid中隐藏IsInDesignMode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30093895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com