2013-09-27 31 views
0

我正在嘗試使用BoundItemUpdtedHandler使用BoundItemUpdated事件來創建Observable流。從無效擴展的事件模式中創建Observable流

有兩個Base的子類,它們爲Grid和Base類設置數據源,我嘗試在引發BoundItemUpdate的時候創建一個流。

public delegate void BoundItemUpdatedHandler<T>(T boundItem, IEnumerable<string> properties) where T : IBoundItem; 

public class BindingList<T> : BindingList<T> where T : IBoundItem 
{ 
.. 
public event BoundItemUpdatedHandler<T> BoundItemUpdated; 
} 

public class Positions: Base 
{ 
var datasource = new BindingList<PositionDTO>(); 
_grid.Datasource = datasource; 
} 

public class Orders: Base 
{ 
var datasource = new BindingList<OrderDTO>(); 
_grid.DataSource = datasource 
} 

public class Base 
{ 
    public IObservable<Stream> GetStream 
    { 
    // How do I create stream using _grid? and event pattern? 
    } 
} 
+0

我認爲你需要提供更多的代碼。我不明白'Stream'與'PositionDTO'和'OrderDTO'的關係。 – Enigmativity

回答

1

我不明白你需要什麼,這將是這個流的來源,它將從哪裏使用,你將如何提高它?

爲了操縱事件,理想的是遵循事件處理標準:
http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx (這是更容易的Rx使用,使用其他類型的代表,其中Rx是更復雜一點,以創建訂閱)

但是如果你需要用BoundItemUpdatedHandler<T>類型訂閱一個事件,你可以在下面做(這只是一個例子)...

[TestMethod] 
    public void CustomEventWithRx() 
    { 
     var sx = 
     Observable.FromEvent(
      new Func<Action<Tuple<IBoundItem, IEnumerable<string>>>, BoundItemUpdatedHandler<IBoundItem>>(
       source => new BoundItemUpdatedHandler<IBoundItem>((s, e) => source(Tuple.Create(s, e)))), 
      add => this.CustomHandler += add, 
      rem => this.CustomHandler -= rem); 

     sx.Select((item,index) => new { item,index}).Subscribe(next => Trace.WriteLine(next.index)); 

     OnCustomHandler(null, null); 
    } 

    public event BoundItemUpdatedHandler<IBoundItem> CustomHandler; 

    protected virtual void OnCustomHandler(IBoundItem bounditem, IEnumerable<string> properties) 
    { 
     BoundItemUpdatedHandler<IBoundItem> handler = CustomHandler; 
     if (handler != null) handler(bounditem, properties); 
    } 

    public delegate void BoundItemUpdatedHandler<T>(T boundItem, IEnumerable<string> properties) where T : IBoundItem; 
+0

Observable.FromEvent是一個難看的提醒,c#中的事件不是一流的。有一個庫有擴展方法來爲系統上的大多數常見事件生成IOBservables。 https://www.nuget.org/packages/reactiveui-events/ – bradgonesurfing

+0

改爲使用FromEventPatten。 BindingList gridDataSource =(BindingList )(this.Grid.DataSource); boundItemChangedStream = Observable.FromEventPattern ,DTOArgs>( X =>(S,A)=> { ... x.Invoke(S,新DTOArgs(){DataRecord = dataRecord,屬性=一個}) ; }, X => gridDataSource.BoundItemUpdated + = X, X => gridDataSource.BoundItemUpdated - = X) 。選擇(I =>新DTOCollection(新[] {i.EventArgs.DataRecord},i.EventArgs .Properties,..)) – skjagini