WPF рдХреЗ рд▓рд┐рдП DXScheduler рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ
рд╕рдордп, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд┐рд▓реА рдЬрд┐рд╕рдореЗрдВ
MVVM рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ
DataContext рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ XAML рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдХреЛ
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА - рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рдПрдХ рдЧреИрд░-рджреГрд╢реНрдп рд╕рдВрдЧреНрд░рд╣рдг рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рдерд╛ рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рдерд╛ред рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдЙрд╕ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ ...
рд▓реЗрдЦ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ MVVM рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, INotifyPropertyChanged рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдвреЗрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЖрджрд┐ред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╣реЛ рд╕рдХреЗред
рддреЛ, рдЪрд▓реЛ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдЧрд╛ред
рд╡рд░реНрдЧ рджреЗрдЦреЗрдВ
рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рдЬрд┐рд╕рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ XAML рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред
public class SomeVisualControl : Control { public static readonly DependencyProperty InnerDataStoreProperty = DependencyProperty.Register("InnerDataStore", typeof(DataStore), typeof(SomeVisualControl), new PropertyMetadata(null)); public DataStore InnerDataStore { get { return (DataStore)GetValue(InnerDataStoreProperty); } set { SetValue(InnerDataStoreProperty, value); } } }
рдХреНрд▓рд╛рд╕ рдбреЗрдЯрд╛рд╕реНрдЯрд░
рдПрдХ рдЧреИрд░-рджреГрд╢реНрдп рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ XAML рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ SomeVisualControl рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╣рд┐рдд рдерд╛ред
DXScheduler рдореЗрдВ, рдПрдХ рд╕рдорд╛рди рдЖрдВрддрд░рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ DependencyObject рдХрд╛ рд╡рдВрд╢рдЬ рдерд╛ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдореЗрдВ DataContext рдирд╣реАрдВ рдерд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рдереАред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдХреЛрдЯреЗрдХреНрд╕реНрдЯ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░рдирд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред
рдРрд╕рд╛ рд╡рд░реНрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
public class DataStore : FrameworkElement { public static readonly DependencyProperty ConnectionStringProperty = DependencyProperty.Register("ConnectionString", typeof(string), typeof(DataStore), new PropertyMetadata(string.Empty)); public string ConnectionString { get { return (string)GetValue(ConnectionStringProperty); } set { SetValue(ConnectionStringProperty, value); } } }
рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
рдореЙрдбрд▓ рд╡рд░реНрдЧ
рдПрдХ рдХрд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
ConnectionString рдЧреБрдг рдЖрдВрддрд░рд┐рдХ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрдЧреНрд░рд╣рдг рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде "рд╕рдВрдмрджреНрдз" рд╣реЛрдЧрд╛ред
public class DataStoreModel { public string ConnectionString { get; set; } public DataStoreModel(string connection) { ConnectionString = connection; } }
рдореЙрдбрд▓рд╡реНрдпреВ рдХреНрд▓рд╛рд╕
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред MVVM рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ
INotifyPropertyChanged рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
public class DataStoreViewModel { DataStoreModel dataStore; public DataStoreViewModel(DataStoreModel dataStore) { if (dataStore == null) throw new ArgumentNullException("dataStore"); this.dataStore = dataStore; } public string ModelConnectionString { get { return dataStore.ConnectionString; } } }
рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рдЪрд┐рддреНрд░ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рддреЛ, рд╣рдо рд╕рдорд╕реНрдпрд╛
рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ:
рдореЙрдбрд▓ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЧреИрд░-рджреГрд╢реНрдп рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП ред
рдЖрдЗрдП рдЖрд╡реЗрджрди рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдПрдВ
< Window x:Class ="DataContextWpfSample.MainWindow"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local ="clr-namespace:DataContextWpfSample"
Loaded ="Window_Loaded"
Title ="MainWindow" Height ="350" Width ="525" >
< Grid >
< local:SomeVisualControl x:Name ="MyVisualControl" >
< local:SomeVisualControl.InnerDataStore >
< local:DataStore ConnectionString ="{Binding ModelConnectionString}" />
</ local:SomeVisualControl.InnerDataStore >
< local:SomeVisualControl.Template >
< ControlTemplate >
< StackPanel >
< TextBlock Text ="DataStore Connection:" FontWeight ="Bold" />
< TextBlock Text ="{Binding Path=InnerDataStore.ConnectionString, RelativeSource={RelativeSource Mode=TemplatedParent}}" TextWrapping ="Wrap" />
</ StackPanel >
</ ControlTemplate >
</ local:SomeVisualControl.Template >
</ local:SomeVisualControl >
</ Grid >
</ Window >
* This source code was highlighted with Source Code Highlighter .
MyVisualControl рдирд╛рдо рдХреЛ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ - рдЗрд╕реЗ рд╡рд┐рдВрдбреЛ рдХреЗ рдХреЛрдб-рдмреИрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗред
рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { string connection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyDB.mdb;Persist Security Info=True"; DataStoreModel sourceData = new DataStoreModel(connection); DataStoreViewModel sourceDataModel = new DataStoreViewModel(sourceData); this.MyVisualControl.DataContext = sourceDataModel; }
рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ - рдПрдХ DataContext рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ "рд▓рд┐рдВрдХ" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдЦрд╛рд▓реА рджреЗрдЦрддреЗ рд╣реИрдВред
рд╣рдо
SNOOP рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рдВрдЧреНрд░рд╣рдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ DataContext рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐:
DataStore рдСрдмреНрдЬреЗрдХреНрдЯ рджреГрд╢реНрдп рдЯреНрд░реА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд╕рдВрджрд░реНрдн рдЗрд╕ рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ ред
DataContext рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрдм DataContext рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рди рдХреЛ рдЖрдВрддрд░рд┐рдХ DataStore рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
FrameworkContentElement рд╡рд░реНрдЧ рдореЗрдВ
DataContextChanged рдИрд╡реЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИред
рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░, рдПрдХ рд╕рд░рд▓ рдХреЛрдб рд▓рд┐рдЦрдХрд░, рд╣рдо рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
public class SomeVisualControl : Control {
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ ...
рдпрджрд┐ рдЖрдк WPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ
DataContextChanged рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВ рд╣реИред
рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдФрд░ рдПрд╕рдПрд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рддреЛ рдЬрдм рдЖрдк рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рдХреЗ DataContext рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ?
рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...
рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рд╡рд┐рдЪрд╛рд░ рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рдЧреИрд░-рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ DependencyProperty рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ, рдЬрд╣рд╛рдВ рдмрдирд╛рдИ рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдЙрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ DataContext рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕рдВрджрд░реНрдн рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп
, рдЖрдкрдХреЛ
рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреИрд▓реНрдб рдХреЙрд▓рдмреИрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред DataContext рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣ рдпрд╣рд╛рдВ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдирд░рдбрд╛рдЯрд╛рд╕реНрдЯреЛрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐ рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ рдХрд┐ DataContext рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ рдФрд░ рдЗрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
public interface IDataContextOwner { object DataContext { get; } void UpdateInnerDataContext(object dataContext); }
рд╣рдо DataContext рдФрд░ PropertyChangedCallback рдкрджреНрдзрддрд┐ рдкрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдЙрд╕реА рд╕рдордп, рд╣рдо рдХреНрд▓рд╛рд╕ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ IDataContextOwner рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ SomeVisualControl рд╣реЛрдЧрд╛) рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ UpdateInnerDonContext рдХреЛ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
public class DataContextBinder : DependencyObject { IDataContextOwner owner; public DataContextBinder(IDataContextOwner owner) { if (owner == null) throw new ArgumentNullException("owner"); this.owner = owner; InitializeBinding(); } protected virtual void InitializeBinding() { Binding binding = new Binding("DataContext"); binding.Source = owner; binding.Mode = BindingMode.OneWay; BindingOperations.SetBinding(this, DataContextProperty, binding); } public object DataContext { get { return (object)GetValue(DataContextProperty); } set { SetValue(DataContextProperty, value); } } public static readonly DependencyProperty DataContextProperty = DependencyProperty.Register("DataContext", typeof(object), typeof(DataContextBinder), new PropertyMetadata(null, new PropertyChangedCallback(OnDataContextChanged))); public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((DataContextBinder)d).OnDataContextChanged(e.OldValue, e.NewValue); } private void OnDataContextChanged(object oldValue, object newValue) { owner.UpdateInnerDataContext(newValue); } }
рдЕрдм рдЖрдЗрдП рд╣рдорд╛рд░реЗ рджреЗрдЦреЗрдВ (SomeVisualControl) рдореЗрдВ IDataContextOwner рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВ:
public class SomeVisualControl : Control, IDataContextOwner {
рдЖрдЦрд┐рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ View рдХреЗ рдЕрдВрджрд░ DataContextBinder рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред
рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
public SomeVisualControl() { this.dataContextBinder = new DataContextBinder(this); }
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдЖрдВрддрд░рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореЙрдбрд▓ рд╕реЗ рд▓рд╛рдЗрди рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рд╣реИред рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореЙрдбрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ DataContext рдХреЛ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ "рдирд┐рдпрдорд┐рдд" рд╕рд╛рдзрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЬрдм рдЧреИрд░-рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдмрд╕ DataContextBinder рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ IDataContextOwner рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдЖрдкрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдЧреБрдгреЛрдВ рдХреЗ рдмреЛрдЭрд┐рд▓ рд▓реЗрдЦрди рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЙрдирдХреЗ рдмреАрдЪ рдмрдВрдзрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред DataContextBinder рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдирдореВрдирд╛ рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
WPF рдФрд░
рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ