ObservableList<T>
を作成しますが、DynamicObject
として作成したいので、要素をプロパティとしてマップできます。だから私はObservableList<T>
の代わりにDynamicObject
から継承しなければならないのです。C#デリゲートを介してインターフェイスを実装
public class DataFieldList : DynamicObject, ICollection<DataField>, INotifyCollectionChanged
{
private ObservableList<DataField> _list;
public DataFieldList()
{
_list = new ObservableList<DataField>();
}
public Object this[String name]
{
get
{
return _list.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase))?.Value;
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this[binder.Name];
return result != null;
}
}
は今、私はまだインターフェイスを実装する必要があるので、私はObservableCollection
のようなクラスを使用することができます。私が知っている
property Collection: ICollection read _list implements ICollection;
:
この機能は、プロパティのimplements
キーワードを経由して、Delphiで含まれている...私はこれらのインタフェースを実装する委譲としての私の_list
を使用するようにしたいのですが、これは不可能であると思われますそのthisとthisの質問は基本的に同じですが、継承の解決策は私には不可能ですし、実際にはインターフェースをプロパティとして公開することもできません。これは、ICollection<T>
のために少し不便であっても、INotifyCollectionChanged
のプロパティではないので、これは目的を無効にするため、うまくいくでしょう - バインドされたオブジェクトによってインターフェイスが実装されていないと、 。
ObservableCollection<T>
のように動作するクラスを取得する他の方法はありますが、DynamicObject
のような動的プロパティにもアクセスできますか?
ユースケースはDataFieldList
の収集源としてだけでなく、列名のコレクションを取得したグリッドです。ここで
<Style BasedOn="{StaticResource {x:Type dxg:GridControl}}" TargetType="{x:Type controls:DataGrid}">
<Setter Property="ItemsSource" Value="{TemplateBinding Rows}">
<Setter Property="ColumnsSource" Value="{TemplateBinding Columns}">
<Setter Property="ColumnGeneratorTemplate">
<Setter.Value>
<DataTemplate>
<ContentControl>
<dxg:GridColumn FieldName="{Binding Name}"/>
</ContentControl>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
、Rows
プロパティはDataFieldList
として行を提供してデータソースが含まれています。
しかし、この方法では、バインディングは動的プロパティを使用しようとしません。 WPFがバインドに使用できるオブジェクトを必要とし、CollectionChangedを –
から受信するオブジェクトが必要です。 –
質問を編集します –