سلام
من یک توضیحاتی به همراه مثال به شما میدم
من یک ChildWindow درست کردم که دوتا تکس باکس توش هست که کدش رو در زیر مینویسم
<TextBox Height="23" HorizontalAlignment="Left" Margin="10,36,0,0" Name="txtName" VerticalAlignment="Top" Width="120" Text="{Binding Name, UpdateSourceTrigger=Explicit}"/>
<TextBox Height="23" HorizontalAlignment="Left" Margin="157,36,0,0" Name="txtTel" VerticalAlignment="Top" Width="120" Text="{Binding Tel,UpdateSourceTrigger=Explicit}"/>
اگر دقت کرده باشید این تکس باکس ها Bind شدن و در کد Binding اونها نوشته شده UpdateSourceTrigger=Explicit این به این علت هست که تا زمانی که ما فرمان ندادیم اطلاعات جدید جایگزین اطلاعات قدیم در سورسی که با این تکس باکس ها Bind شده نشود چرا؟ چون ممکنه شما اطلاعات رو تغییر بدید اما منصرف بشید و ثبت نکنید و فرم رو ببندید پس نباید تغییر در دیتاگرید پیدا بشه
حالا
توی همون فرم اولی که داشتیم من یک دکمه اضافه کردم که باعث نمایش ChildWindow به همراه اطلاعات رکورد انتخاب شده میشه
private void btnNewWin_Click(object sender, RoutedEventArgs e)
{
if (this.dataGrid1.SelectedItems.Count == 1)
{
ChildWindow chWin = new ChildWindow { Owner = this, DataContext = this.dataGrid1.SelectedItem };
chWin.ShowDialog();
}
}
دقت کنید ما چک میکنیم که اگر یک رکورد انتخاب شده بود این عمل انجام بشه
در کد بالا ما DataContext فرم CHild رو برابر this.dataGrid1.SelectedItem قرار دادیم این کار باعث میشه که اون Bindig که در فرم Child انجام داده بودیم اطلاعات این رکورد رو نشون بده و هر تغییر در اون TextBox ها باعث تغییر اطلاعات رکورد و همچنین باعث تغییر در شئی db که توی مثال قبل ساخته بودیم بشه (اما یادتون نره ما با تنظیم bindng در حالت UpdateSourceTrigger=Explicit باعث میشیم این تغییرات هر وقت ما بخواهیم اعمال بشه
حالا
توی Child Window یک Button برای ثبت گذاشتیم
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
BindingExpression binex;
binex = this.txtName.GetBindingExpression(TextBox.TextProp erty);
binex.UpdateSource();
binex = this.txtTel.GetBindingExpression(TextBox.TextPrope rty);
binex.UpdateSource();
(this.Owner as MainWindow).Update();
MessageBox.Show("Update");
}
کد بالا چکار میکنه :
BindingExpression binex;
binex = this.txtName.GetBindingExpression(TextBox.TextProp erty);
binex.UpdateSource();
باعث میشه اون تغییری که دادیم در سورسی که به TextBox Name وصل هست اعمال بشه و در نتیجه در گرید و شئی db هم اعمال میشه
تغییرات در دیتا گرید منعکس شده (نکته اگر UpdateSourceTrigger=Explicit رو نمیگذاشتید این تغییرات بدون فرمان ما هم منعکس میشد و به کد بالا نیاز نبود)
حالا کد زیر
(this.Owner as MainWindow).Update();
متد update رو که در فرم اصلی ساختیم فراخونی میکنه که یک دستور ساده توش هست
public void Update()
{
this.db.SubmitChanges();
}
تغییرات در دیتابیس ذخیره شد