2013-02-19 17 views
8

Ho un progetto, in cui associo la proprietà IsChecked di una casella con un get/set nel codebehind. Tuttavia, quando l'applicazione si carica, non si aggiorna, per qualche motivo. Incuriosito, ho messo a nudo giù ai suoi principi fondamentali, in questo modo:WPF DataBinding non si aggiorna?

//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> 

E, ecco, quando ho impostato a true, esso non ha aggiornato !

Chiunque può trovare una soluzione o spiegare perché?

Grazie, sarebbe apprezzato.

+0

Leggi [materiale introduttivo ] (http://msdn.microsoft.com/en-us/library/ms752347.aspx). –

+2

Non penso di meritare un downvote perché leggo un'altra fonte e non MSDN ... –

+2

@ofstream Non ho fatto downvote, ma ho il sospetto che sia perché questa domanda non mostra alcuno sforzo di ricerca. Questo problema è estremamente semplice e chiunque lavori con il sistema di bind di WPF sa che è necessario implementare 'INotifyPropertyChanged' per far sì che le proprietà comunichino all'interfaccia utente di rivalutare l'associazione quando vengono cambiate. Praticamente ogni singolo tutorial WPF che introduce le associazioni copre questo concetto. – Rachel

risposta

22

Al fine di sostenere l'associazione dati, l'oggetto di dati deve implementare INotifyPropertyChanged

Inoltre, è sempre una buona idea per 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> 

Codice Dietro:

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

Funziona, grazie! Ti accetto quando SO mi consente :) –

+0

breve, pulito e facile da capire. Grazie! – mcy