2013-02-19 27 views
8

Mam projekt, w którym wiążę właściwość IsChecked pola wyboru z get/set w codebehind. Jednak po załadowaniu aplikacji nie aktualizuje się z jakiegoś powodu. Zaintrygowany, pozbawiono go do jego podstawy, tak:WPF DataBinding nie aktualizuje?

//using statements 
namespace NS 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private bool _test; 
     public bool Test 
     { 
      get { Console.WriteLine("Accessed!"); return _test; } 
      set { Console.WriteLine("Changed!"); _test = value; } 
     } 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Test = true; 
     } 
    } 
} 

XAML:

<Window x:Class="TheTestingProject_WPF_.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <Viewbox> 
     <CheckBox IsChecked="{Binding Path=Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    </Viewbox> 
</Grid> 

A oto i oto, kiedy ustawić go na true, to nie aktualizuje !

Ktoś może wymyślić poprawkę lub wyjaśnić dlaczego?

Dzięki, byłoby to docenione.

+0

Przeczytaj [materiał wprowadzający ] (http://msdn.microsoft.com/en-us/library/ms752347.aspx). –

+2

Nie sądzę, żebym zasłużył sobie na awans, ponieważ czytałem inne źródło, a nie MSDN ... –

+2

@ofstream Nie spadłem, ale podejrzewam, że to dlatego, że to pytanie nie pokazuje żadnych wysiłków badawczych. Ten problem jest niezwykle prosty, a każdy, kto pracuje z systemem wiążącym WPF wie, że musisz zaimplementować 'INotifyPropertyChanged', aby twoje właściwości powiadomiły interfejs, aby ponownie oszacowały powiązanie, gdy zostaną zmienione. Prawie każdy samouczek WPF wprowadzający wiązania obejmuje tę koncepcję. – Rachel

Odpowiedz

22

W celu wspierania powiązania danych, Twój obiekt danych musi implementować INotifyPropertyChanged

Również, to zawsze dobry pomysł, aby Separate Data from Presentation

public class ViewModel: INotifyPropertyChanged 
{ 
    private bool _test; 
    public bool Test 
    { get { return _test; } 
     set 
     { 
      _test = value; 
      NotifyPropertyChanged("Test"); 
     } 
    } 

    public PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

<Window x:Class="TheTestingProject_WPF_.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Viewbox> 
     <CheckBox IsChecked="{Binding Path=Test, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    </Viewbox> 
</Grid> 

Kodeksu tyle:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModel{Test = true}; 
    } 
} 
+0

To działa, dziękuję! Przyjmuję Cię, gdy SO pozwala mi :) –

+0

krótkie, czyste i łatwe do zrozumienia. dzięki! – mcy

Powiązane problemy