바인딩 DynamicObject 을 DataGrid 자동 열 생?
-
20-09-2019 - |
문제
나는 아직도 실험 DynamicObjects.지금 내가 필요 몇 가지 정보:내가 노력하는 바인드체에서 상속하 DynamicObject WPF DataGrid 지 않는(Silverlight).
나는 어떻게 DataGrid 자동으로 만들고 그 열에서 사용할 수 있는 공공의 속성하는 개체는 일반적으로 생성된 런타임에?하는 것이 가능할까요?
해결책
이 없 균일한 방법을 쿼리의 동적물성,일반적으로 그것이 예상되는 당신이 그들을 알고 있습니다.가 DynamicObject
, 하고,구현을 덮어쓸 수 있습니다. GetMemberNames
과는 일반적으로 제공합성,그러나 그것은 정말 의미한 디버깅을 위한 요구 사항이 없기 때문에 그것이 제공하는 모든 속성입니다.그렇지 않으면 당신의 자신 DynamicObject
당신은 단지 자신의 방법을 가져올 수 있는 속성을 기반으로 동적인 구현합니다.예를 들어 ExpandoObject
를 쿼리할 수 있도록 모든 속성을 사용하여 IDictionary
인터페이스입니다.
그래서 당신은 방법의 속성을 알려줘야 합 DataGrid.불행하게도 DataGrid,문제로 구현하는 ICustomTypeDescriptor
말 DataGrid 에 대한 귀하의 속성은 DataGrid 얻 TypeDescriptors 형식을 사용하지 않는 인스턴스는 문제에 대한 동적 객체로,그러나의 구현 ITypedList
의 컬렉션에 DynamicObjects 으로 작동 할 것이 매우 작은 잡았다의하지 않는 경우를 구현하는 비일반 IList
인터페이스에서 당신의 컬렉션에서 제거됩니다에 도달하기 전에는 지점 검사 ITypeList
.
그래서 요약,구현 컬렉션 ITypedList
고 IList
.가 ITypedList
null 을 반환한 GetListName
그냥 구현 GetItemProperties(PropertyDescriptor[] listAccessors)
;시 listAccessors
반환 PropertyDescriptorCollection 의 PropertyDescriptors 에 대한 각 회원에 따라 이름이 최고의 표현하는 동적 객체를 인스턴스에서 당신의 목록(대부분 그냥 첫 번째 목).이 있을 구현하의 서브 클래스 PropertyDescriptor,쉽고 일반적인 방법을 Get/Set 값을 사용하는 것이 오픈 소스 framework Dynamitey
using System;
using System.ComponentModel;
using Dynamitey;
public class DynamicPropertyDescriptor:PropertyDescriptor
{
public DynamicPropertyDescriptor(string name) : base(name, null)
{
}
public override bool CanResetValue(object component)
{
return false;
}
public override object GetValue(object component)
{
return Dynamic.InvokeGet(component, Name);
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
Dynamic.InvokeSet(component, Name, value);
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override Type ComponentType
{
get { return typeof(object); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get
{
return typeof (object);
}
}
}
다른 팁
제 생각에는 DataGrid
용도 TypeDescriptor
객체 속성을 가져 오려면 열을 생성합니다. 그래서 당신은 당신의 DynamicObject
구현 ICustomTypeDescriptor
. 구현 GetProperties
객체의 동적 특성을 반환하도록 방법.