2013-02-19 28 views
8

Ich habe ein Projekt, wo ich die IsChecked-Eigenschaft eines Kontrollkästchens mit einem get/set im Codebehind binden. Wenn die Anwendung jedoch geladen wird, wird sie aus irgendeinem Grund nicht aktualisiert. Fasziniert ich es auf seine Grundlagen abgespeckte, wie folgt aus:WPF DataBinding wird nicht aktualisiert?

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

Und, siehe da, wenn ich es auf true gesetzt, hat es nicht aktualisieren !

Jeder kann sich etwas einfallen lassen oder erklären warum?

Danke, es würde geschätzt werden.

+0

Read [einführendes Material ] (http://msdn.microsoft.com/en-us/library/ms752347.aspx). –

+2

Ich glaube nicht, dass ich einen Downvote verdiene, weil ich eine andere Quelle und nicht MSDN gelesen habe ... –

+2

@ofstream Ich habe nicht downvote, aber ich vermute, es liegt daran, dass diese Frage keinen Forschungsaufwand zeigt. Dieses Problem ist extrem einfach und jeder, der mit dem Bindungssystem von WPF arbeitet, weiß, dass Sie 'INotifyPropertyChanged' implementieren müssen, damit Ihre Eigenschaften die Benutzeroberfläche benachrichtigen, um die Bindung neu zu bewerten, wenn sie geändert werden. So ziemlich jedes einzelne WPF-Tutorial, das Bindungen einführt, deckt dieses Konzept ab. – Rachel

Antwort

22

Um Daten zu unterstützen Bindung, Ihr Datenobjekt INotifyPropertyChanged

Auch implementieren muß, ist es immer eine gute Idee, 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> 

-Code Behind:

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

Das funktioniert, danke! Ich werde dich akzeptieren, wenn SO mich lässt :) –

+0

kurz, sauber und leicht zu verstehen. Vielen Dank! – mcy