2010-12-28 24 views
6

WPF Bağlama ve değişkenler ile oynuyorum. Görünüşe göre bir kişi yalnızca DependencyProperties'i bağlayabilir. Gayet iyi çalışır aşağıdaki malzemeleri geldi: arka planda kodlama dosya:WPF Bağlayıcıya Bağımlılık/BağımlılıkProperty

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public string Test 
    { 
     get { return (string)this.GetValue(TestProperty); } 
     set { this.SetValue(TestProperty, value); } 
     //set { this.SetValue(TestProperty, "BBB"); } 
    } 
    public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
     "Test", typeof(string), typeof(MainWindow), new PropertyMetadata("CCC")); 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(Test); 
     Test = "AAA"; 
     MessageBox.Show(Test); 
    } 
} 

XAML:

<Window x:Class="WpfApplication3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,86,0,0" Name="textBox1" VerticalAlignment="Top" Width="152" 
      Text="{Binding Test, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}"/> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="320,85,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,138,0,0" Name="textBox2" Text="{Binding Test, Mode=TwoWay}" VerticalAlignment="Top" Width="152" /> 
</Grid> 

iki TextBoxes birini bir başka güncelleyin. Ve Düğme bunları "AAA" olarak ayarlar.

Ancak şimdi Setter işlevini, yorumlanmış olanla değiştirdim (verilen değerin bazı işlemlerini simüle ederek). Özellik değeri değiştiğinde "BBB" ye sıfırlanmasını beklerim. Düğmeye bastığınızda bunu yaparsınız, bu, özelliği kod olarak ayarladığınız zamandır. Ancak, WPF Bağlamaları'nı etkilemeyen bir sebepten dolayı, TextBox içeriklerini ve dolayısıyla mülkü değiştirebiliyorsunuz, ancak Setter asla çağrılmıyor. Bunun neden böyle olduğunu merak ediyorum ve beklenen davranışa nasıl ulaşılacağını merak ediyorum.

+0

olası yinelenen kullanmak zorunda olduğuna dikkat Setters ile belirlenemeyen bildirimler?] (http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

cevap

13

Bir Bağımlılık Özelliği için CLR Özelliği sarıcısı asla çağrılmayı garanti etmez ve bu nedenle, hiçbir zaman buradaki ek mantığı yerleştirmemelisiniz. DP değiştirildiğinde ek mantıka ihtiyacınız olduğunda, özellik değiştirilen geri bildirimi kullanmalısınız. Senin durumunda

..

public string Test 
{ 
    get { return (string)this.GetValue(TestProperty); } 
    set { this.SetValue(TestProperty, value); } 
} 

public static readonly DependencyProperty TestProperty = 
    DependencyProperty.Register("Test", 
    typeof(string), 
    typeof(MainWindow), 
    new PropertyMetadata("CCC", TestPropertyChanged)); 

private static void TestPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
{ 
    MainWindow mainWindow = source as MainWindow; 
    string newValue = e.NewValue as string; 
    // Do additional logic 
} 
2

XAML yerine mülkiyet setter.That çağıran, doğrudan SetValue arayacak çünkü bağlayıcı etkilemeyecektir Kişisel değişikliğin ne kadar bağımlılık özelliği sistemi works.When bir bağımlılık özellik kayıtlı bir varsayılan değer belirtilebilir. Bu değer GetValue'dan döndürülür ve mülkünüzün varsayılan değeridir.

da WPF: What distinguishes a Dependency Property from a regular CLR Property?

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

ve

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

kaçırmayın aşağıdaki bağlantıyı kontrol edin ve adil bir genel bakış elde etmek için, Robert Rossney yayınının içi okumaya XAML özelliği:

Ayrıca, normal CLR özelliklerinde setter yazma herhangi özel mantık Bağımlılık Özellikleri yürütülmez aksine bunun yerine PropertyChangedCallback mekanizmasını [WPF ait

http://blogs.msdn.com/b/delay/archive/2010/03/23/do-one-thing-and-do-it-well-tip-the-clr-wrapper-for-a-dependencyproperty-should-do-its-job-and-nothing-more.aspx