2013-02-02 31 views
1

剛開始使用ReactiveUI。我基本上用查詢的結果填充網格。我的viewmodel目前看起來像這樣。從IObservable填充ReactiveCollection

public class QueryViewModel : ViewModelBase 
{ 

    private readonly ResultSet _resultSet = null; 

    public ReactiveCollection<GridColumn> Columns { get; private set; } 
    public ReactiveCollection<GridRow> Rows { get; private set; } 

    public QueryViewModel() 
    { 
     _resultSet = ... run query 

     Columns = new ReactiveCollection<GridColumn>(from c in _resultSet.Columns select new GridColumn(c)); 
     Rows = new ReactiveCollection<GridRow>(from r in _resultSet.Rows select new GridRow(r)); 

     //Rows = new ReactiveCollection<GridRow>(); 
     //_resultSet.ObservableRows 
     //   .Subscribe(r => Rows.Add(new GridRow(r)));      

    }  
} 

正如你看到的,我可以得到使用一個IEnumerable填充時,它的工作,但你可以從註釋掉位看到,我不是很確定的從的IObservable來填充的方式。

請有人指出我有什麼好的方向。

編輯:

完全公開,我包括我犯了一個錯誤在這裏ObservableRows的情況下實施。

Return Observable.Create<Row>((o) => { 
      var cn = New SqlConnection(connection); 
      var cmd = New SqlCommand(sql, cn); 
      var asyncReader = Observable.FromAsyncPattern<SqlDataReader>(cmd.BeginExecuteReader, cmd.EndExecuteReader); 
      IDisposable subscription; 
      Try { 
       cn.Open(); 
       subscription = asyncReader().Subscribe(rdr => PublishRows(rdr, o, columns)); 
      } 
      Catch Exception ex { 
       o.OnError(ex); 
      } 

      Return Disposable.Create(() => { 
        subscription.Dispose(); 
        cmd.Dispose(); 
        cn.Close(); 
        cn.Dispose(); 
      }); 
} 

許多THX

小號

回答

3

如何:

Rows = _resultSet.ObservableRows.CreateCollection(); 
+0

THX非常保羅。好而簡單! –