İlk olarak window class’imizda bulunan bir property’e nasil bind edebilecegimize bakalim:
|
public class MyData { public string Name { get; set; } public string Surname { get; set; } } public partial class Main : Window { public MyData MyDataProp { get; set; } public Main() { MyDataProp = new MyData { Name = “Bill”, Surname = “Gates” }; InitializeComponent(); } } |
Main classindaki MyDataProp’a bind etmek icin windowa ismini verin (Mainw),
Gridin DataContextini Main (window classina) olarak tanimlayin
Controllerinizde path olarak bind etmek istediginiz property nin adini girin.
|
<Window x:Class=”dinceru.wordpress.com.PropertyWPF.Main” xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:local=”clr-namespace:dinceru.wordpress.com.PropertyWPF” Title=”Main” Height=”300″ Width=”300″ Name=”Mainw”>
<Grid HorizontalAlignment=”Stretch” VerticalAlignment=”Top”> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <Grid.DataContext> <Binding ElementName=”Mainw” Path=”MyDataProp”/> </Grid.DataContext> <TextBlock Grid.Row=”0″ Name=”textBlock1″ Text=”{Binding Path=Name}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” />
<TextBlock Grid.Row=”1″ Name=”textBlock2″ Text=”{Binding Path=Surname}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> </Grid> </Window> |
Bu source’u tek bir yerde kullanicaksak datacontext tanimlamamiza gerek yok, direk olarak binding expression yazabiliriz.
|
<TextBlock Grid.Row=”0″ Name=”textBlock3″ Text=”{Binding ElementName=Mainw, Path=MyDataProp.Name}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> |
Üstteki örnekte iki textblock’u textboxa cevirip, ikisinide ayni property’e bind edelim.
|
<Grid> <Grid.DataContext> <Binding ElementName=”Mainw” Path=”MyDataProp”/> </Grid.DataContext> <TextBox Grid.Row=”0″ Name=”textBlock1″ Text=”{Binding Path=Name}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> <TextBox Grid.Row=”1″ Name=”textBlock2″ Text=”{Binding Path=Name}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> </Grid> |
Çalıştırdığımız zaman herhangi bir textbox’ta yaptigimiz degisikliklerin sadece o textbox tan cikinca digerine aktarildigini goruruz. Bunun sebebi UpdateSourceTrigger propertysinin Text icin varsayilan deger olarak “LostFocus” almasi. Istedigimiz islevi bunu “PropertyChanged” olarak degistirerek saglayabiliriz.
|
<TextBox Grid.Row=”0″ Name=”textBlock1″ Text=”{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> <TextBox Grid.Row=”1″ Name=”textBlock2″ Text=”{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> |
![]() |
UpdateSourceTrigger bunlarin disinda “default” ve “explicit” degerlerini alabilir. Eger UpdateSourceTrigger=Explicit olarak set edilmis ise bind oldugu property yanlizca “UpdateSource” metoduna yapilan cagri ile guncellenir. Soldaki ornekte bu uc ozellikde kullanilmistir. |
|
<StackPanel Grid.Row=”0″> <TextBlock>UpdateSourceTrigger=LostFocus</TextBlock> <TextBox Name=”lostFocucTextBox” Text=”{Binding Path=Name, UpdateSourceTrigger=LostFocus}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> </StackPanel> <StackPanel Grid.Row=”1″> <TextBlock>UpdateSourceTrigger=PropertyChanged</TextBlock> <TextBox Name=”propertyChangedTextBox” Text=”{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> </StackPanel> <StackPanel Grid.Row=”2″> <TextBlock>UpdateSourceTrigger=Explicit</TextBlock> <TextBox Name=”explicitTextBox” Text=”{Binding Path=Name, UpdateSourceTrigger=Explicit}” Width=”100″ Height=”20″ HorizontalAlignment=”Left” VerticalAlignment=”Top” /> <Button Height=”23″ Name=”button1″ Width=”125″ Click=”button1_click” Content=”Update property value” /> </StackPanel> |
Bu ornek calistiginda ilk textbox a yapilan degisiklikler yanlizca focusu kaybettiginde, ikinci textbox a yapilan degisiklikler aninda guncellenecektir. Son textboxa yapilan degisiklikler ise sadece “UpdateSource” metodu ile guncellenebilir. Bu islem icin ekrana bir buton yerlestiriyorum ve click event handlerinda ise asagidaki kodu eklemem yetiyor.
|
public void button1_click(object sender, RoutedEventArgs e) { BindingExpression be= this.explicitTextBox.GetBindingExpression(TextBox.TextProperty); be.UpdateSource(); } |
Burada explicitTextBox in “Text” propertysine ait binding expression objesinin UpdateSource metodunu cagirarak guncellemeyi gerceklestiriyoruz.
Ikinci bolumde gorusmek uzere….
Anlatilanlar icin kaynak koda buradan ulasabilirisiniz.
Dincer Uyav

Nice Blog. Good Look
Yorum�Yorumlar yazan: CialisEi — Temmuz 17, 2008 @ 4:47 pm