2010-09-07 41 views
6

tôi muốn có một nút mà khi nó đẩy một chuỗi mới là showen trong textboxC# 4 quan sát viên thực hiện

những gì tôi làm sai

somone thể inlight tôi tại sao doesnt mã này làm việc? ...

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public event Startdelegate StartEvent; 
     myButton button; 
     newTb[] tb; 
     public Form1() 
     { 
      InitializeComponent(); 

      button = new myButton(); 
      button.Parent = this; 
      button.Location = new Point(120, 0); 
      button.Text = "click on me!!!"; 
      tb = new newTb[8]; 

      for (int i = 0; i <= 80; i += 15) 
      { 
       tb[i/15] = new newTb(); 
       tb[i/15].Parent = this; 
       tb[i/15].Location = new Point(i + i, i + i); 
       // button.Subscribe(tb[i/15]); 
      } 

      button.Click += new EventHandler(button_Click); 

     } 
     private void button_Click(object sender, EventArgs e) 
     { 
      button.s = "this is clicking"; 
      //button.Notify(); 
     } 
    } 

    public class myButton : Button, IObservable<newTb> 
    { 
     public string s; 
     private List<IObserver<newTb>> observers; 

     public myButton() 
     { 
      observers = new List<IObserver<newTb>>(); 
     } 

     public IDisposable Subscribe(IObserver<newTb> observer) 
     { 
      if (!observers.Contains(observer)) 
      { 
       observers.Add(observer);   
      } 
      return new Unsubscriber(observers, observer); 
     } 

     protected void Notify(newTb tb) 
     { 
      foreach (IObserver<newTb> observer in observers) 
      { 
       observer.OnNext(tb); 
      } 
     } 

     #region Unsubscriber 
     private class Unsubscriber : IDisposable 
     { 
      private List<IObserver<newTb>> observers; 
      private IObserver<newTb> observer; 

      public Unsubscriber(List<IObserver<newTb>> observers, IObserver<newTb> observer) 
      { 
       this.observers = observers; 
       this.observer = observer; 
      } 

      public void Dispose() 
      { 
       if (observer != null && observers.Contains(observer)) 
       { 
        observers.Remove(observer); 
       } 
      } 
     } 
     #endregion 

     class newTb : TextBox, IObserver<string> 
     { 
      string s; 
      public void OnCompleted() { } 
      public void OnError(Exception error) { } 
      public void OnNext(string value) 
      { 
       this.Text = value; 
      } 
     } 
    } 
} 
+0

+1 Chỉ để bạn có thể có một số điểm để mở một tiền thưởng khác :-) – SKG

+0

Nếu câu trả lời đúng, bạn nên đánh dấu câu hỏi là đã trả lời để tiền thưởng có thể được trao. –

+0

nhưng nó không phải là một cách khác của imlpment tôi muốn implment như họ làm trong msdn trong ví dụ của tôi –

Trả lời

5

Theo http://msdn.microsoft.com/en-us/library/dd783449.aspx

Các giao diện IObserver và IObservable cung cấp một cơ chế tổng quát để thông báo push-based, còn được gọi là các mẫu thiết kế quan sát. Giao diện IObservable đại diện cho lớp gửi thông báo (nhà cung cấp); Giao diện IObserver đại diện cho lớp nhận chúng (người quan sát).

T đại diện cho lớp cung cấp thông tin thông báo.

Trong trường hợp của bạn, thông tin bạn chuyển là thư (chuỗi). Trong mẫu của bạn, bạn đã đi qua sự kiểm soát newTB

Với miêu tả sau

public class ObservableButton : Button, IObservable<string> {} 
    public class ObserverTextBox : TextBox, IObserver<string>  {} 

Every thing rơi vào nơi.

Phương thức Thông báo cho lớpObservableButton có thể được viết theo cách này.

public void Notify(string text) 
    { 
     foreach (IObserver<string> observer in _Observers) 
     {     
      observer.OnNext(text); 
     } 
    } 

Ở đây, nguồn đầy đủ đang

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace ObservableDemo 
{ 
    public class ObservableButton : Button, IObservable<string> 
    { 
     private List<IObserver<string>> _Observers; 

     public ObservableButton() 
     { 
      _Observers = new List<IObserver<string>>(); 
     } 
     IDisposable IObservable<string>.Subscribe(IObserver<string> observer) 
     { 
      if (!_Observers.Contains(observer)) 
      { 
       _Observers.Add(observer); 
      } 
      return new Unsubscriber(_Observers, observer); 
     } 
     public void Notify(string text) 
     { 
      foreach (IObserver<string> observer in _Observers) 
      {     
       observer.OnNext(text); 
      } 
     } 
     private class Unsubscriber : IDisposable 
     { 
      private List<IObserver<string>>  observers; 
      private IObserver<string>   observer; 

      public Unsubscriber(List<IObserver<string>> observers, IObserver<string> observer) 
      { 
       this.observers = observers; 
       this.observer = observer; 
      } 
      public void Dispose() 
      { 
       if (observer != null && observers.Contains(observer)) 
       { 
        observers.Remove(observer); 
       } 
      } 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace ObservableDemo 
{  
    public class ObserverTextBox : TextBox, IObserver<string> 
    { 
     private IDisposable unsubscriber; 

     void IObserver<string>.OnCompleted() 
     { 
     } 
     void IObserver<string>.OnError(Exception error) 
     { 

     } 
     void IObserver<string>.OnNext(string value) 
     { 
      this.Text = value; 
      this.Refresh(); 
     } 
     public virtual void Subscribe(IObservable<string> provider) 
     { 
      if (provider != null) 
       unsubscriber = provider.Subscribe(this); 
     } 
     public virtual void Unsubscribe() 
     { 
      unsubscriber.Dispose(); 
     } 
    }  
} 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace ObservableDemo 
{ 
    public partial class Form1 : Form 
    { 
     ObservableButton button; 

     public Form1() 
     { 
      InitializeComponent(); 

      button   = new ObservableButton(); 
      button.Parent = this; 
      button.Location = new Point(120, 0); 
      button.Text  = "click on me!!!"; 
      button.Click += new EventHandler(button_Click); 

      for (int i = 0; i < 8; i++) 
      { 
       ObserverTextBox tb = new ObserverTextBox(); 
       tb.Parent   = this; 
       tb.Location   = new Point(0 , 30+(i*30)); 
       tb.Width   = 300; 
       tb.Subscribe(button); 
      } 
     } 
     private void button_Click(object sender, EventArgs e) 
     { 
      button.Notify(String.Format("{0} this is the message", DateTime.Now)); 
     } 
     void Form1_Load(object sender, System.EventArgs e) 
     { 
     } 
    } 
} 
+0

cảm ơn u nó hoạt động có thể bạn trong ánh sáng với một số sự kiện tôi không hiểu nơi tôi đã sai –

+0

Thực ra tôi cũng có một vấn đề với mô hình IObserver/IObservable. Tôi sẽ cố gắng viết vấn đề của bạn từ đầu tối nay. –

+0

cảm ơn bạn rất nhiều. –

1

Tôi tin rằng đây có thể là vấn đề của bạn:

class newTb : TextBox, IObserver<string> 

Bởi vì những gì bạn những gì bạn muốn quan sát dựa trên mẫu này:

observers = new List<IObserver<newTb>>(); 

thực sự là IObser ver <newTb>, loại khác với IObserver < chuỗi >. Lớp newTb của bạn không thực hiện giao diện đầu tiên, nó chỉ thực hiện giao diện thứ hai. Không chắc chắn tại sao điều này biên dịch (nếu nó không), mặc dù.

Các vấn đề liên quan