WPF рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ

рдЫрд╡рд┐ DevExpress рдкрд░, рд╣рдо WPF рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдШрдЯрдХреЛрдВ рдкрд░ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рд░реЗрдЦрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ DXPivotGrid - Excel рд╕реЗ PivotTable рдЯреВрд▓ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред рдирдП рдШрдЯрдХреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдореМрдЬреВрджрд╛ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, WinForms рдХреЗ рд▓рд┐рдП PivotGrid рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВред рдЕрдХреНрд╕рд░ рдпрд╣ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ рдЬреЛ .NET 2.0 рдХреЗ рддрд╣рдд рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдИрдВред рдЬрдм рдореИрдВрдиреЗ WPF рдХреЗ рд▓рд┐рдП PivotGrid рд▓рд┐рдЦрд╛, рддреЛ рдореБрдЭреЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, "рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд") рдХреЗ рдХрд╛рд░рдг рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред





Microsoft рдиреЗ .NET 3.0 рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рдШрдЯрдирд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХреА: рдпрд╣ рдорд╛рдирдХ рдШрдЯрдирд╛рдУрдВ рдХреА рднрд┐рдиреНрдирддрд╛ рд╣реИ рдЬреЛ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИред рджреВрд╕рд░реА рдУрд░, рд╕рд╛рдзрд╛рд░рдг рд╣реИрдВрдбрд▓рд░ рджреЛ рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред



рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЗрд╡реЗрдВрдЯ рд╕реЗ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ WPF IDisposable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред



рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, Microsoft рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ (рдХрдордЬреЛрд░ рдШрдЯрдирд╛рдУрдВ - " Microsoft рдХреЗ рдХрдордЬреЛрд░ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ") рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдРрд╕реЗ рдЖрдпреЛрдЬрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рджрд╕реНрдпрддрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реЛред



рдПрдХ рдХрдордЬреЛрд░ рдШрдЯрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: WeakEventManager рдпрд╛ RoutedEvent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред



WeakEventManager



WeakEventManager рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдПрдХ рдореМрдЬреВрджрд╛ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдХрдордЬреЛрд░ рдШрдЯрдирд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЙрддреНрдкрд╛рдж рдХреЛрд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬреЛ .NET 2.0 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдХрдордЬреЛрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: WeakEventManager (рдбрд┐рд╕реНрдкреИрдЪрд░) рдФрд░ WeakEventListener (рд╢реНрд░реЛрддрд╛)ред рдИрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдкреИрдЪрд░ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╕реНрд░реЛрдд рдФрд░ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рд╣реИ, рдЬреЛ рдХрдбрд╝реА рдХреЛ рддреЛрдбрд╝рддреА рд╣реИред



рдпрд╣ рдПрдХ рдЗрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдкреИрдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред



public class MyEventManager : WeakEventManager { static MyEventManager CurrentManager { get { //     Type managerType = typeof(MyEventManager); MyEventManager currentManager = (MyEventManager)WeakEventManager.GetCurrentManager(managerType); if(currentManager == null) { currentManager = new MyEventManager(); WeakEventManager.SetCurrentManager(managerType, currentManager); } return currentManager; } } MyEventManager() { } //  "T"      public static void AddListener(T source, IWeakEventListener listener) { CurrentManager.ProtectedAddListener(source, listener); } //  "T"      public static void RemoveListener(T source, IWeakEventListener listener) { CurrentManager.ProtectedRemoveListener(source, listener); } protected override void StartListening(object source) { //    // , ((T)source).Event += EventHandler; } protected override void StopListening(object source) { //    // , ((T)source).Event -= EventHandler; } //   тАУ    //      void EventHandler(object sender, EventArgs e) { base.DeliverEvent(sender, e); } }
      
      







рдФрд░ рдпрд╣ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ: https://gist.github.com/777559 ред Wem рдХрдорд╛рдВрдб рдкрд░ рд╣реИрдВрдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред



рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХрдордЬреЛрд░ рдИрд╡реЗрдВрдЯ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдирд╛рдо, рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ EventHandler рд╡рд┐рдзрд┐ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдЬреЛ рдПрдХ рдХрдордЬреЛрд░ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреА рд╣реИ, рдЙрд╕реЗ IWeakEventListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рд╣реИред рдЖрдкрдХреЛ рдИрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╣реА рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЧрд▓рдд рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, System.ExecutionEngineException рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЗ рдХреБрдЫ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдкреИрдЪрд░реНрд╕ рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИред



рдпрд╣рд╛рдБ IWeakEventListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ:



 class MyEventListener : IWeakEventListener { bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) { if(managerType == typeof(MyEventManager)) { //   return true; // ,     } return false; // -    } }
      
      







рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖






рд░реВрдЯреЗрдб рдЗрд╡реЗрдВрдЯреНрд╕



рдЕрдЧреНрд░реЗрд╖рд┐рдд рдИрд╡реЗрдВрдЯ XAML (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, EventTrigger рдореЗрдВ ) рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛ рд╣реИ рдпрд╛ рдЬреЛ рджреГрд╢реНрдп рд╡реГрдХреНрд╖ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИрдВред



рдЙрдирдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн:






рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ MSDN рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ: рдирд┐рдпрдорд┐рдд рдШрдЯрдирд╛рдХреНрд░рдо рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдХреА рджреЛ рдореБрдЦреНрдп рдХрдорд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред



рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХреЙрд▓ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ


рдпрд╣ UIElement.RaiseEventImpl рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рд░реВрдЯ рдХреА рдЧрдИ рдШрдЯрдирд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ:



 internal static void RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) { EventRoute route = EventRouteFactory.FetchObject(args.RoutedEvent); if (TraceRoutedEvent.IsEnabled) { TraceRoutedEvent.Trace(TraceEventType.Start, TraceRoutedEvent.RaiseEvent, new object[] { args.RoutedEvent, sender, args, args.Handled }); } try { args.Source = sender; BuildRouteHelper(sender, route, args); route.InvokeHandlers(sender, args); args.Source = args.OriginalSource; } finally { if (TraceRoutedEvent.IsEnabled) { TraceRoutedEvent.Trace(TraceEventType.Stop, TraceRoutedEvent.RaiseEvent, new object[] { args.RoutedEvent, sender, args, args.Handled }); } } EventRouteFactory.RecycleObject(route); }
      
      







рдпрд╣ рддрдм рддрдХ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк BuildRouteHelper рдФрд░ InvokeHandlers рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 100 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рд╛рд░реА рдЬрдЯрд┐рд▓рддрд╛ рдХрд┐рд╕реА рдПрдХ рдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред рдпрд╣ рдЬрдЯрд┐рд▓рддрд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдХреНрд╕рд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рдмрдирд╛рддреА рд╣реИред



рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ UIElement рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджрд┐рдирд╛рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ UIElement рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдЯ рдХреА рдЧрдИ рдШрдЯрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рдпрджрд┐ рдЖрдкрдХреА рддрдХрдиреАрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред



рдЕрдВрдд рдореЗрдВ



рдпрджрд┐ рдЖрдк рдкреБрд░рд╛рдиреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдИрд╡реЗрдВрдЯ рдХреЙрд▓ рдХрдИ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ RoutedEvents рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрд▓ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ .NET 2.0 рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЙрдорди рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП WeakEventManager рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдмреЛрдЭрд┐рд▓, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХред



рдпреЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рдореАрдбрд┐рдпрдордЯреНрд░рд╕реНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдЧрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рд░реНрдгрдп рд╕рдВрдЦреНрдпрд╛ 3 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред



All Articles