2010-12-28 17 views
6

Używam funkcji wiązania WPF i zmiennych. Najwyraźniej można związać tylko DependencyProperties. I mają pochodzić z następujących, które działa perfekcyjnie: opóźnieniem kodu pliku:WPF Wiązanie ze zmienną/DependencyProperty

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> 

Dwa tekstowych aktualizacji jednego innego. A przycisk ustawia je na "AAA".

Ale teraz zastąpiłem funkcję Settera tym, który został skomentowany (symulując pewne manipulowanie podaną wartością). Spodziewam się, że za każdym razem, gdy zmieni się wartość nieruchomości, zostanie ona zresetowana do "BBB". Robi to po naciśnięciu przycisku, czyli po ustawieniu właściwości w kodzie. Ale z jakiegoś powodu nie ma wpływu na Wiązania WPF, czyli można zmienić zawartość TextBox, a tym samym właściwość, ale najwyraźniej Setter nigdy nie jest wywoływany. Zastanawiam się, dlaczego tak się dzieje i jak można osiągnąć oczekiwane zachowanie.

+0

możliwy duplikat [WPF: własność XAML deklaracje nie są ustawiane za pomocą ustawiaczy?] (http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

Odpowiedz

13

Opakowanie właściwości CLR dla właściwości zależności nigdy nie ma gwarancji, że zostanie wywołane i dlatego nie należy umieszczać tam żadnej dodatkowej logiki. Kiedy potrzebujesz dodatkowej logiki, gdy DP jest zmieniony, powinieneś użyć funkcji zmiany połączenia zwrotnego właściwości.

W twoim przypadku ..

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

Twoja zmiana nie wpłynie na wiązanie ponieważ XAML wezwie setValue bezpośrednio, zamiast nazywać swoją setter.That nieruchomość jest jak system właściwość zależność works.When zależność Właściwość jest zarejestrowana, można określić wartość domyślną. Ta wartość jest zwracana z GetValue i jest wartością domyślną dla twojej właściwości.

Sprawdź link poniżej i przeczytać na stanowisku Roberta Rossney, aby uzyskać uczciwą Przegląd

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

również nie przegap

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

i

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

Należy również zauważyć, że w przeciwieństwie do normalnych właściwości CLR każdy zwyczaj logika piszesz w seter nie będą wykonywane w oknie Właściwości zależności, a nie trzeba używać mechanizmu PropertyChangedCallback

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