2016-07-22 23 views
0

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を使用するようにしたいのですが、これは不可能であると思われますそのthisthisの質問は基本的に同じですが、継承の解決策は私には不可能ですし、実際にはインターフェースをプロパティとして公開することもできません。これは、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として行を提供してデータソースが含まれています。

答えて

1

私が正しくあなたを理解していれば、あなたはこの

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

    public object Value { get; set; } 
} 

public class PropertiesCollection 
{ 
    public PropertiesCollection(IEnumerable<DataField> collection) 
    { 
     _collection = collection; 
    } 

    private IEnumerable<DataField> _collection; 

    public object this[string name] 
    { 
     get 
     { 
      return _collection.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase))?.Value; 
     } 
    } 
} 

public class CustomList : ObservableCollection<DataField> 
{ 
    private PropertiesCollection _collection; 

    public CustomList() 
    { 
     _collection = new PropertiesCollection(this); 
    } 

    public PropertiesCollection Properties 
    { 
     get 
     { 
      return _collection; 
     } 
    } 

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(nameof(Properties))); 
     base.OnCollectionChanged(e); 
    } 
} 

そして結合のようなものは、次のようなものになります取得する必要があります:私はちょうど構図代わりの継承を使用

<TextBlock Text="{Binding Properties[SomeProperty],Mode=OneWay}">    
    </TextBlock> 

すなわちを。 残念ながら、私たちはコンポジションだけで満足する必要があります(C#では複数の継承がサポートされていないことをよく知っています)

+0

しかし、この方法では、バインディングは動的プロパティを使用しようとしません。 WPFがバインドに使用できるオブジェクトを必要とし、CollectionChangedを –

+0

から受信するオブジェクトが必要です。 –

+0

質問を編集します –

関連する問題