Ich bin gerade erst mit MVVM so Entschuldigungen, wenn ich etwas wirklich dummes getan habe. Ich habe versucht, einen sehr einfachen Test zu schreiben, um zu sehen, ob ich mich an alles erinnern kann, und für das Leben von mir kann ich nicht sehen, warum es nicht funktioniert.WPF MVVM TextBox Textbindung
Meiner Ansicht nach habe ich eine TextBox, deren Texteigenschaft an einen Wert im ViewModel gebunden ist. Dann sollte beim Drücken einer Taste der Wert geändert und die textBox aktualisiert werden.
Ich kann sehen, der Wert ändert sich (Ich habe eine MessageBox.Show() Zeile in den Tastendruck Befehl) jedoch die TextBox nicht aktualisiert.
Ich nehme an, dass dies bedeutet, dass ich das Ereignis INotifyPropertyChanged
nicht korrekt implementiert habe, aber nicht in der Lage bin, meinen Fehler zu sehen.
Kann mir jemand in die richtige Richtung zeigen? 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();
}
}
Ansichtsmodell
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 einen so langen Pfosten und es eine Stelle, mein Fehler Post zu sein, aber ich habe so lange es sah, und ich weiß nicht, was ich falsch mache
Danke!
Ich nehme an, dass Sie auch eine Property Change-Benachrichtigung für die Eigenschaft "helloWorld" benötigen, da Sie den Bindungspfad 'helloWorld.Message' verwenden. –