From 3f2bd744380b3d5a8511ea8b2746d4c2ed353d34 Mon Sep 17 00:00:00 2001 From: jafreli Date: Mon, 2 Jun 2025 16:11:50 +0200 Subject: [PATCH] Aufgabe Timer in Titel --- FahzeugWPF/MainWindow.xaml | 2 +- FahzeugWPF/MainWindowViewModel.cs | 19 +++++++++- FahzeugWPF/RelayCommand.cs | 44 +++++++++++++++++++++++ FahzeugWPF/ViewModelBase.cs | 60 +++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 FahzeugWPF/RelayCommand.cs create mode 100644 FahzeugWPF/ViewModelBase.cs diff --git a/FahzeugWPF/MainWindow.xaml b/FahzeugWPF/MainWindow.xaml index cb06bca..7f55608 100644 --- a/FahzeugWPF/MainWindow.xaml +++ b/FahzeugWPF/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:FahzeugWPF" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel, IsDesignTimeCreatable=False}" - Title="Fahrzeuge" Height="450" Width="800"> + Title="{Binding Path=MainWindowTitle}" Height="450" Width="800"> (ref _mainWindowTitle, value); + } } + public ObservableCollection Fahrzeuge { get; } = new ObservableCollection(); private async void InitialisiereDasViewModell() @@ -23,4 +35,9 @@ class MainWindowViewModel this.Fahrzeuge.Add(fahrzeug); } } + + private void _timer_Elapsed(object? sender, ElapsedEventArgs e) + { + this.MainWindowTitle = $"Fahrzeuge {DateTime.Now.ToLongTimeString()}"; + } } diff --git a/FahzeugWPF/RelayCommand.cs b/FahzeugWPF/RelayCommand.cs new file mode 100644 index 0000000..7480008 --- /dev/null +++ b/FahzeugWPF/RelayCommand.cs @@ -0,0 +1,44 @@ +namespace FahzeugWPF; + +using System.Diagnostics; +using System.Windows.Input; + +public class RelayCommand : ICommand +{ + readonly Action _execute = null; + readonly Predicate _canExecute = null; + + public RelayCommand(Action execute) + : this(execute, null) + { + // Nothing to do + } + + public RelayCommand(Action execute, Predicate canExecute) + { + if (execute == null) + { + throw new ArgumentNullException("execute"); + } + + this._execute = execute; + this._canExecute = canExecute; + } + + [DebuggerStepThrough] + public bool CanExecute(object parameter) + { + return _canExecute == null ? true : _canExecute(parameter); + } + + public event EventHandler CanExecuteChanged + { + add { CommandManager.RequerySuggested += value; } + remove { CommandManager.RequerySuggested -= value; } + } + + public void Execute(object parameter) + { + _execute(parameter); + } +} diff --git a/FahzeugWPF/ViewModelBase.cs b/FahzeugWPF/ViewModelBase.cs new file mode 100644 index 0000000..933416f --- /dev/null +++ b/FahzeugWPF/ViewModelBase.cs @@ -0,0 +1,60 @@ +namespace FahzeugWPF; + +using System.ComponentModel; +using System.Linq.Expressions; +using System.Reflection; +using System.Runtime.CompilerServices; + +public abstract class ViewModelBase : INotifyPropertyChanged +{ + #region Events + + [field: NonSerialized] + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged(Expression> expression) + { + var lambdaExpression = expression as LambdaExpression; + + MemberExpression memberExpression = null; + if (lambdaExpression.Body is UnaryExpression) + { + var unaryExpression = lambdaExpression.Body as UnaryExpression; + memberExpression = unaryExpression.Operand as MemberExpression; + } + else + { + memberExpression = lambdaExpression.Body as MemberExpression; + } + + if (memberExpression != null) + { + var propertyInfo = memberExpression.Member as PropertyInfo; + if (propertyInfo != null) + { + OnPropertyChanged(propertyInfo.Name); + } + } + } + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + + protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) + { + return false; + } + + field = value; + OnPropertyChanged(propertyName); + return true; + } + #endregion Events +}