2

すべて、簡単な質問です。DataGridを使用してViewModelにバインドしたMVVMアプリケーションがあります

<DataGrid ItemsSource="{Binding Path=Resources}" ...></DataGrid>

Resources経由で定義されます

public ObservableCollection<ResourceViewModel> Resources { get; private set; }

ただし、ResourceViewModelクラスには、 に表示したいプロパティだけでなく、 に表示したくないDataGrid他のプロパティもあります。クラスはDataGridResourceViewmodel

public class ResourceViewModel : WorkspaceViewModel, IDataErrorInfo
{
    readonly Resource resource;
    readonly ResourceDataRepository resourceRepository;
    private bool isSelected;

    public ResourceViewModel(Resource resource, ResourceDataRepository resourceRepository)
    {
        if (resource == null)
            throw new ArgumentNullException("resource");
        if (resourceRepository == null)
            throw new ArgumentNullException("resourceRepository");
        this.resource = resource;
        this.resourceRepository = resourceRepository;
    }

    public string KeyIndex 
    { 
        get { return this.resource.KeyIndex; } 
        set 
        {
            if (value == this.resource.KeyIndex)
                return;
            this.resource.KeyIndex = value;
            base.OnPropertyChanged("KeyIndex");
        }
    }

    public string FileName
    {
        get { return this.resource.FileName; }
        set 
        {
            if (value == this.resource.FileName)
                return;
            this.resource.FileName = value;
            base.OnPropertyChanged("FileName");
        }
    }

    public List<string> ResourceStringList
    {
        get { return this.resource.ResourceStringList; }
        set 
        {
            if (Utilities.Utilities.ScrambledEquals<string>(this.resource.ResourceStringList, value))
                return;
            this.resource.ResourceStringList = value;
            base.OnPropertyChanged("ResourceStringList");
        }
    }

    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            if (value == isSelected)
                return;
            isSelected = value;
            base.OnPropertyChanged("IsSelected");
        }
    }
}

IsSelectedに表示したくない場所で、 のDataGrid各項目をResourceStringListの別の列に表示したいDatagrid。私の質問は次のとおりです。

IsSelected1. に[as a Checkbox] が表示されないようにするにはどうすればよいDataGridですか?

DataGrid2.項目を別々の列に自動的に表示するためのバインドを取得するにはどうすればよいですか?

何を試しましたか:

  1. クラスから継承してResourceViewmodel代わりにこれにバインドしようとしましたが、これはうんざりで、別のよりエレガントなソリューションが必要です。お願いします :]。

  2. これをどのように進めればよいかわかりません。に格納されるアイテムの数Listは変数であり、実行時に設定されるため、List.

いつもありがとうございます。

4

2 に答える 2

5

オプションは、Silvermind が述べたように自動生成をオフにする (つまり、DataGrid.AutoGenerateColumns を false に設定してから列を定義する) か、ITypedList を実装することだと思います。たとえば、ITypedList を実装し、非表示にするプロパティに設定した属性に基づいてプロパティを返す派生 ObservableCollection を作成できます。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.DataContext = new TypedListObservableCollection<Foo>();

        InitializeComponent();
    }
}

public class TypedListObservableCollection<T> : ObservableCollection<T>
    , ITypedList
{
    public TypedListObservableCollection()
    {
    }

    PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)
    {
        return TypeDescriptor.GetProperties(typeof(T), new Attribute[] { BrowsableAttribute.Yes });
    }

    string ITypedList.GetListName(PropertyDescriptor[] listAccessors)
    {
        return typeof(T).Name;
    }
}

public class Foo
{
    public string Name
    {
        get;
        set;
    }

    [Browsable(false)]
    public bool IsSelected
    {
        get;
        set;
    }
}
于 2013-05-21T21:16:15.017 に答える
2

私にとっては、列を自動生成しない方が簡単です。しかし、それは個人的な好みなので、一部のプロパティを公開しないようにする最も簡単な方法は、インターフェイスの力を使用することだと思います:)

  1. IResourceViewModel の ObservableCollection にバインド - Resources プロパティを具象型ではなくインターフェイスのリストにする
  2. ResourceViewModel に IResourceViewModel を実装させる
  3. IResourceViewModel で、インターフェイスからグリッドに表示したくないプロパティを削除します
于 2013-05-21T21:29:57.240 に答える