无法将DatePicker绑定到ViewModel



我正在尝试实现一个日期拾取器并将其绑定到我创建的模型。我在App.xaml.cs:

中创建了一个全局锦标赛对象。
private Tournament _tournament;
public Tournament tournament { 
get { return _tournament; } 
set { _tournament = value; OnPropertyChanged("tournament"); }  
}

我已经做了一个OnStartup覆盖来启动我的windows:

protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//setup score
score = new Score();
// Tournament setup
tournament = new Tournament();
tournament.GamesToWin = 1;
tournament.Games = new List<Game>(1);
tournament.Players = new List<Player>(2) { new Player(), new Player() };
//tournament.TimeAndDate = new DateTime(2021, 11, 22);
tournament.Winner = null;
// Initializing the UserInput
UserInput userInput = new UserInput();
UserInputWindowViewModel userinputViewModel = new UserInputWindowViewModel();
userInput.DataContext = userinputViewModel;
// Opening the UserInput Window
bool? res = userInput.ShowDialog();
// If the UserInput Window is closed, open the next Window
if (res == true)
{
// Opening the MainWindow
MainWindow main = new MainWindow();
main.Show();
}
else
{
Shutdown();
}
}

Model.cs (Tournament.cs):

public class Tournament : INotifyPropertyChanged
{
private Player _winner;
private DateTime? _timeAndDate;
private List<Player> _players;
public List<Player> Players
{
get { return _players; }
set { _players = value; OnPropertyChanged("Players"); }
}
private List<Game> _games;
public List<Game> Games
{
get { return _games; }
set { _games = value; OnPropertyChanged("Games"); }
}
private int _gamesToWin;
public int GamesToWin
{
get { return _gamesToWin; }
set { _gamesToWin = value; OnPropertyChanged("GamesToWin"); }
}
public Player Winner
{
get { return _winner; }
set { _winner = value; OnPropertyChanged("Winner"); }
}
public DateTime? TimeAndDate
{
get { return _timeAndDate; }
set { _timeAndDate = value; OnPropertyChanged("TimeAndDate"); }
}
#region PropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}

ViewModel.cs (UserInputWindowViewModel.cs):

public class UserInputWindowViewModel
{
// Calling the current app to access the tournament object globally
public App currentApp = Application.Current as App;
#region The players object
private List<Player> _players;
public List<Player> Players
{
get { return _players; }
set { _players = value; }
}
#endregion
#region The DateTime object
private DateTime? _dateTime;
public DateTime? TournamentDateTime
{
get { return _dateTime; }
set { _dateTime = value; }
}
#endregion
public UserInputWindowViewModel()
{
Tournament tournament = currentApp.tournament;
Players = tournament.Players;
TournamentDateTime = new DateTime(2021, 11, 22);
tournament.TimeAndDate = TournamentDateTime;
//TournamentDateTime = tournament.TimeAndDate;
}
#region ICommand Members
private ICommand mUpdater;
public ICommand UpdateCommand
{
get
{
if (mUpdater == null)
mUpdater = new Updater();
return mUpdater;
}
set
{
mUpdater = value;
}
}
private class Updater : ICommand
{
public bool CanExecute(object parameter) => true;
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
}
}
#endregion
}

在我的窗口(UserInput.xaml)我有以下日期picker:

<DatePicker SelectedDate="{Binding TournamentDateTime, Mode=TwoWay}"/>

我已经将我的视图模型中的日期设置为22-11-2021作为测试,但是当我更改日期时,它不会改变。我做错了什么?

编辑:我还尝试了ViewModel中的OnPropertyChanged,这不起作用

您忘记在UserInputWindowViewModel.cs下实现INotifyPropertyChanged

public class UserInputWindowViewModel : INotifyPropertyChanged
{
}

还要确保在属性设置器中触发PropertyChanged事件,这对于双向绑定很重要

public DateTime? TournamentDateTime
{
get { return _dateTime; }
set 
{
_dateTime = value; 
OnPropertyChanged(nameof(TournamentDateTime);
}
}

我也会建议不要直接从视图模型访问Application,最好将tournament对象作为依赖项传递给视图模型,尽快将关注点更好地分离

我设法解决了我的问题:我做了一个小函数来更新全局模型:

public void updateModel(DateTime? s)
{
currentApp.tournament.TimeAndDate = s;
}

我已经将这一小段代码添加到视图模型中的getter/setter中(注意我使用了DateTime)。现在将其设置为当前日期):

private DateTime? _dateTime = DateTime.Now;
public DateTime? TournamentDateTime
{
get { return _dateTime; }
set { _dateTime = value; updateModel(value); }
}

这解决了我所有的问题与日期选择器。我不需要在viewmodel中使用INotifyPropertychanged因为我的模型已经实现了它

最新更新