erstmal vorneweg, ich bin von meinen Kenntnissen zu MVVM den Anfängern zuzuordnen. Ich habe mich vorher der Suche bedient, allerdings meinen konkretes Problem nicht gefunden und bitte daher freundlich um eure unterstützung.
Ich versuche seit ein paar Tagen folgendes Problem zu lösen:
Meine Anwendung besteht aus einem Window in dem ein Frame enthalten ist. In dieses Frame lade ich anlassbezogen Pages (View) zur Darstellung der Daten aus den jeweiligen Viewmodels.
Nun möchte ich Fehlermeldungen/Abschlussmeldungen die aus den verschiedenen Viewmodels resultieren in einem zentralen Textfeld auf dem MainWindow anzeigen lassen.
Mein Ansatz war es ein separates Message Model/Viewmodel zu erstellen und per Binding an des Textfeld im MainWindow zu knüpfen. Der Messagetext wird aus dem Viewmodel der aktiven View (hier am Beispiel des CustomerViewModels) an das Message Model übergeben.
Leider passiert nichts, auch das übergeben des Messagetext an das MessageViewmodel (NewMessage) hat nicht funktioniert. Was mache ich hier falsch? Ist das vielleicht der gänzlich falsche Ansatz?
VIEW#
<Window x:Class="WaWiP.MainWindow"
xmlns:localVM="clr-namespace:WaWiP.ViewModels"
…
<StackPanel HorizontalAlignment="Center">
<StackPanel.DataContext>
<localVM:MessageViewModel/>
</StackPanel.DataContext>
<Label>Meldung:</Label>
<TextBlock x:Name="txtMessage" Text="{Binding NewMessage, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
#MESSAGEVIEMODEL
using System.ComponentModel;
using System.Runtime.CompilerServices;
using WaWiP.Models;
namespace WaWiP.ViewModels
{
class MessageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void Changed([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public Message NewMessage { get; set; }
public MessageViewModel()
{
NewMessage = new Message();
}
}
}
#MESSAGE
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace WaWiP.Models
{
public class Message : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void Changed([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _Text;
public string Text
{
get { return _Text; }
set { _Text = value; Changed(); }
}
}
}
VIEWMODEL CUSTOMER
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using WaWiP.Commands;
using WaWiP.HelperClass;
using WaWiP.Models;
namespace WaWiP.ViewModels
{
class CustomerViewModel : INotifyPropertyChanged
{
#region INotifyPropertyChanged_Implementation
public event PropertyChangedEventHandler PropertyChanged;
private void Changed([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
Message objMessage;
CustomerService objCustomerService;
public CustomerViewModel()
{
objCustomerService = new CustomerService();
//LoadData();
CurrentCustomer = new Customer();
updateCommand = new RelayCommand(Update);
objMessage = new Message();
}
#region DisplayOperations
private ObservableCollection<Customer> customerList;
public ObservableCollection<Customer> CustomerList
{
get { return customerList; }
set { customerList = value; Changed(); }
}
private void LoadData()
{
//Bei initialisierung werden nachfolgenden Daten bereitgestellt
CustomerList = new ObservableCollection<Customer>(objCustomerService.GetAll());
}
#endregion
private Customer currentCustomer;
public Customer CurrentCustomer
{
get { return currentCustomer; }
set { currentCustomer = value; Changed(); }
}
#region UpdateOperations
private RelayCommand updateCommand;
public RelayCommand UpdateCommand
{
get { return updateCommand; }
}
public void Update()
{
try
{
var IsUpdated = objCustomerService.Update(CurrentCustomer);
if (IsUpdated)
{
objMessage.Text = "Die Kundendaten wurden aktualisiert";
//LoadData();
}
else
{
objMessage.Text = "Update Operation failed";
}
}
catch (Exception Ex)
{
objMessage.Text = Ex.Message;
}
}
#endregion
}
}