WPF Binding mit INotifyPropertyChanged nicht aktualisiert
Ich zu sein scheinen mit ernsthaften Problemen, immer meine WPF-Benutzeroberfläche zu aktualisieren, wenn ich update, wenn ich ein update der Immobilie gebunden ist. Hier ist meine Sicht der model-Klasse definition:
namespace WpfModel
{
class AppModel : INotifyPropertyChanged
{
private int _count = 7;
public int Count { get { return _count; }
set { _count = value; OnPropertyChanged("Count"); } }
public void Increment()
{
Count++;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs("prop");
handler(this, e);
}
}
};
}
Diese gebunden ist meine einfache Benutzeroberfläche in den folgenden XAML-Code:
<Window x:Class="WpfModel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfModel"
Title="WPF Data Model Demo" Height="128" Width="284" >
<Window.DataContext>
<vm:AppModel />
</Window.DataContext>
<Grid Height="Auto" Width="Auto">
<Button Margin="0,0,12,12" Name="IncButton" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="IncButton_Click" Content="Increment" />
<Label Content="Count Variable:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" />
<Label Height="28" Margin="116,12,0,0" Name="CountLabel" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Content="{Binding Path=Count}" />
</Grid>
</Window>
Die Anwendung ist definiert wie folgt:
namespace WpfModel
{
///<summary>
///Interaction logic for MainWindow.xaml
///</summary>
public partial class MainWindow : Window
{
private AppModel _model = new AppModel();
public MainWindow()
{
InitializeComponent();
//_model = new AppModel();
}
private void IncButton_Click(object sender, RoutedEventArgs e)
{
}
}
}
Wenn die app startet, alles ist peachy, das label selbst zeigt zunächst, was Wert ist in der Count-Eigenschaft des Modells. Aufruf von Inkrement-updates das Modell richtig, und direkt Inkrementieren Sie die Count-Eigenschaft, wie gezeigt, in der der code funktioniert auch Prima.
Das problem hier ist, dass das PropertyChanged-Ereignishandler nie scheint Hinzugefügt. Ich kann Schritt für Schritt durch den code im debugger, und sehen den Wert in die Eigenschaft zu aktualisieren, und ich kann sehen, dass der Aufruf von OnPropertyChanged auch, aber das PropertyChanged-Ereignishandler selbst ist immer null.
Gibt es ein problem mit meiner Bindung vielleicht?
Ich bin mit MSVC 2010 Express.
InformationsquelleAutor Chris D. | 2010-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem ist, dass die WpfModel Sie als Instanz-variable, _model, ist nicht die gleiche Instanz verwendet wird als das Fenster DataContext. Es ist also nicht gebunden durch nichts, und seine PropertyChanged immer null.
Ändern Sie Ihre XAML-Code für das setzen des datacontext auf diese:
Loszuwerden, die Instanz-variable deklariert, in der code-behind -, und befestigen Sie die OnPropertyChanged-Implementierung (verwenden Sie den parameter statt der Zeichenkette "prop"), und es funktioniert.
InformationsquelleAutor ArildF
diese Zeile:
werden sollte:
Übergeben Sie den string "prop", so die gebundenen Werte hören sich für "Zählen", werden nicht ausgelöst.
** * * EDIT
Basierend auf deinen anderen Anmerkungen (Antwort?) Ich dachte, ich hätte besser dieses update mit einem fix - Sie konnte die Antwort bereits gegeben, natürlich, aber ich will nicht kopieren jemand anderes :).
Fügen Sie dem click-Ereignishandler:
ähem, möchten Sie vielleicht überprüfen Sie Ihren code
Haha - Kopieren und einfügen - danke Jungs
Vielen Dank für das update, sobald ich Lesen Sie den Beitrag von ArildF unten ich schaute in die Herstellung sicher, dass meine _model-Instanz-variable war eigentlich diejenige sein, die das Formular verwendet, und es war natürlich nicht. 🙂 <code> _model =.DataContext als AppModel </code> Festen alles für mich, nachdem ich kümmerte mich um das "prop" typo (Hoppla!). Danke für die hilfreichen Antworten an alle!
InformationsquelleAutor Leom Burke