WPF-MVVM-textBox Text Verbindlich
Bin ich gerade erste Schritte mit dem MVVM-also entschuldigt, wenn ich getan habe, etwas wirklich dummes. Ich habe versucht, das schreiben ein sehr einfacher test, um zu sehen, ob ich könnte mich an alles erinnern, und für das Leben von mir ich kann nicht sehen, warum es nicht funktioniert.
In meiner Sicht ich habe eine textBox, wo Sie seine text-Eigenschaft gebunden ist, auf einen Wert im ViewModel. Dann beim drücken einer Taste der Wert sollte geändert werden und das Textfeld zu aktualisieren.
Kann ich den Wert nicht verändern (ich habe eine MessageBox.Show() Zeile in der buttom drücken Sie command), aber das Textfeld nicht aktualisiert.
Ich gehe davon aus, dass dies bedeutet, ich habe nicht richtig umgesetzt INotifyPropertyChanged
Fall richtig, aber bin nicht in der Lage, um zu sehen, mein Fehler.
Kann jemand mich in die richtige Richtung?
Hier ist der code:
Ansicht
<Window x:Class="Mvvm.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">
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBox Height="40" Width="200" Text="{Binding helloWorld.Message, UpdateSourceTrigger=PropertyChanged}"/>
<Button Command="{Binding UpdateTimeCommand}">Update</Button>
</StackPanel>
</Window>
Hinter Ansicht
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel.MainWindowViewModel();
}
}
ViewModel
namespace Mvvm.ViewModel
{
internal class MainWindowViewModel
{
private HelloWorld _helloWorld;
///<summary>
///Creates a new instance of the ViewModel Class
///</summary>
public MainWindowViewModel()
{
_helloWorld = new HelloWorld("The time is " + DateTime.Now.ToString("HH:mm:ss"));
UpdateTimeCommand = new Commands.UpdateTimeCommand(this);
}
///<summary>
///Gets the HellowWorld instance
///</summary>
public HelloWorld helloWorld
{
get
{
return _helloWorld;
}
set
{
_helloWorld = value;
}
}
///<summary>
///Updates the time shown in the helloWorld
///</summary>
public void UpdateTime()
{
helloWorld = new HelloWorld("The time is " + DateTime.Now.ToString("HH:mm:ss"));
}
public ICommand UpdateTimeCommand
{
get;
private set;
}
}
Modell
namespace Mvvm.Model
{
class HelloWorld : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public HelloWorld(string helloWorldMessage)
{
Message = "Hello World! " + helloWorldMessage;
}
private string _Message;
public string Message
{
get
{
return _Message;
}
set
{
_Message = value;
OnPropertyChanged("Message");
}
}
private void OnPropertyChanged(string p)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(p));
}
}
}
}
Befehle
namespace Mvvm.Commands
{
internal class UpdateTimeCommand : ICommand
{
private ViewModel.MainWindowViewModel _viewModel;
public UpdateTimeCommand(ViewModel.MainWindowViewModel viewModel)
{
_viewModel = viewModel;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_viewModel.UpdateTime();
}
}
}
Sorry für so ein langer post und es wird ein spot-mein Fehler-post, aber ich habe es für so lange und ich weiß nicht, was ich falsch mache
Dank!
helloWorld
Eigenschaft, da Sie den verbindlichen Pfad helloWorld.Message
.InformationsquelleAutor Nick Williams | 2012-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem, das Sie haben, ist, dass Sie ändern die falsche Eigenschaft. Anstelle der änderung der
HelloWorld.Message
Eigenschaft, die Sie ändernMainWindowViewModel.HelloWorld
Eigenschaft. Dein code funktioniert OK, wenn Sie ändern Sie diese Zeile:Für diese
Wenn Sie möchten, halten Sie Ihre original-code, dann müssen Sie die INotifyPropertyChanged implementieren, die für Ihr ViewModel, und steigen Sie das Ereignis, wenn Sie ändern
helloWorld
Objekt.Hoffe, das hilft
die view- - Modell ist eigentlich, wo die INotifyPropertyChanged implementiert sein in den ersten Platz! Denken Sie daran, dass die view- - Modell ist die Klasse, zu der Sie binden die UI-und dies während des bindevorgangs, dass die UI ist in der Lage, suscribe, um die Ereignisse der view-Modell.
mehr dann in ein Modell 😉 man sollte immer die INotifyPropertyChanged implementieren Sie in den Klassen, die Sie binden, sonst kann es Ergebnis in memoryleaks. code.logos.com/blog/2008/10/...
Ja! es ist völlig üblich, zu INotifyPropertyChanged im ViewModel. Go for it
Bedenken Sie, dass viele frameworks, die verwendet werden, für Modelle (Entity-Framework kommt in den Sinn), setzen Ihre model-Klassen mit INotifyPropertyChanged standardmäßig. Dieses können Sie setzen Sie die Daten, aber die ViewModel-Eigenschaften, die die Ansicht muss wie auf die Präsentation der Daten. Wenn es nicht erhalten Benachrichtigungen, dass sich etwas verändert hat, dann haben Sie die statischen Ansichten, die nicht nutzen, viele der mächtigsten Funktionen von WPF.
InformationsquelleAutor Agustin Meriles
Ich glaube, Sie brauchen, zu implementieren PropertyChanged-Benachrichtigung auf Ihrem ViewModel. Erstellen Sie eine neue Datei HelloWorld in die Methode UpdateTime, aber die UI nicht kennt.
Bearbeiten
Habe ich eine ViewModel-Basisklasse, die ich leite alle meine ViewModels aus. Es implementiert die INotifyPropertyChanged, und Verweise auf meine relais-Befehl Klassen, und einige andere gemeinsame Sachen. Ich empfehle immer die INotifyPropertyChanged implementiert, auf das ViewModel. Das ViewModel ist es zu entlarven Daten auf der Benutzeroberfläche und kann es nicht tun, dass für Daten, die sich ändern, ohne die Schnittstelle.
In der Tat. Die Idee hinter haben ein ViewModel ist eine Klasse, die Daten dient, um die Ansicht so, dass die Ansicht können Sie besser nutzen. Auch wenn die angezeigten Daten, wie text (in diesem Fall "HelloWorld".Message) nicht direkt bedient durch das ViewModel, schließlich ist es wahrscheinlich, dass andere Eigenschaften ausgesetzt werden, dort, Bürsten, sichtbar, Staaten, etc.
InformationsquelleAutor CodeWarrior
ich denke, dein ViewModel muss INotifyPropertyChanged implementieren zu,
oder Sie können den DataContext rufen Sie vor InitializeComponents(), wenn Sie das tun, sollten Sie den code ändern, um NICHT eine neue Instanz erstellen jedes update wie Agustin Meriles sagte.
InformationsquelleAutor user1064519
In Ihrem VM (Klasse "HelloWorld"), müssen Sie verwenden Sie Ihre Modell
Also, Ihre Klassen Aussehen wird:
inset in Ihrem ICommands
InformationsquelleAutor zzfima