Reputation: 83
Question : Create a simple WPF application using MVVM.Application should display a button for each day os the current year and Display a date.Upon clicking on the buttons they should display a message with name of the day of week.
Solution:I have created this application and run successfully but it's code wise doesn't look excellent.
Model Code:
public class DateDataModel : INotifyPropertyChanged
{
DateTime FirstDate= new DateTime( DateTime.Now.Year, DateTime.Now.Month, 1);
public string Now
{
get { return FirstDate.ToShortDateString(); }
set
{
Now = value;
OnPropertyChanged("Now");
}
}
public string Now1
{
get { return FirstDate.AddDays(1).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now1");
}
}
public string Now2
{
get { return FirstDate.AddDays(1).ToShortDateString(); }
set
{
Now2 = value;
OnPropertyChanged("Now2");
}
}
public string Now3
{
get { return FirstDate.AddDays(3).ToShortDateString(); }
set
{
Now5 = value;
OnPropertyChanged("Now3");
}
}
public string Now4
{
get { return FirstDate.AddDays(4).ToShortDateString(); }
set
{
Now4 = value;
OnPropertyChanged("Now4");
}
}
public string Now5
{
get { return FirstDate.AddDays(5).ToShortDateString(); }
set
{
Now5 = value;
OnPropertyChanged("Now5");
}
}
public string Now6
{
get { return FirstDate.AddDays(6).ToShortDateString(); }
set
{
Now6 = value;
OnPropertyChanged("Now6");
}
}
public string Now7
{
get { return FirstDate.AddDays(7).ToShortDateString(); }
set
{
Now7 = value;
OnPropertyChanged("Now7");
}
}
public string Now8
{
get { return FirstDate.AddDays(8).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now8");
}
}
public string Now9
{
get { return FirstDate.AddDays(9).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now9");
}
}
public string Now10
{
get { return FirstDate.AddDays(10).ToShortDateString(); }
set
{
Now3 = value;
OnPropertyChanged("Now10");
}
}
public string Now11
{
get { return FirstDate.AddDays(11).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now11");
}
}
public string Now12
{
get { return FirstDate.AddDays(12).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now112");
}
}
public string Now13
{
get { return FirstDate.AddDays(13).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now13");
}
}
public string Now14
{
get { return FirstDate.AddDays(14).ToShortDateString(); }
set
{
Now1 = value;
OnPropertyChanged("Now14");
}
}
public string Now15
{
get { return FirstDate.AddDays(15).ToShortDateString(); }
set
{
Now15 = value;
OnPropertyChanged("Now15");
}
}
public string Now16
{
get { return FirstDate.AddDays(16).ToShortDateString(); }
set
{
Now16 = value;
OnPropertyChanged("Now16");
}
}
public string Now17
{
get { return FirstDate.AddDays(17).ToShortDateString(); }
set
{
Now17 = value;
OnPropertyChanged("Now17");
}
}
public string Now18
{
get { return FirstDate.AddDays(18).ToShortDateString(); }
set
{
Now18 = value;
OnPropertyChanged("Now18");
}
}
public string Now19
{
get { return FirstDate.AddDays(19).ToShortDateString(); }
set
{
Now19 = value;
OnPropertyChanged("Now19");
}
}
public string Now20
{
get { return FirstDate.AddDays(20).ToShortDateString(); }
set
{
Now20= value;
OnPropertyChanged("Now20");
}
}
public string Now21
{
get { return FirstDate.AddDays(21).ToShortDateString(); }
set
{
Now21 = value;
OnPropertyChanged("Now21");
}
}
public string Now22
{
get { return FirstDate.AddDays(22).ToShortDateString(); }
set
{
Now22 = value;
OnPropertyChanged("Now22");
}
}
public string Now23
{
get { return FirstDate.AddDays(23).ToShortDateString(); }
set
{
Now23 = value;
OnPropertyChanged("Now23");
}
}
public string Now24
{
get { return FirstDate.AddDays(24).ToShortDateString(); }
set
{
Now24 = value;
OnPropertyChanged("Now24");
}
}
public string Now25
{
get { return FirstDate.AddDays(25).ToShortDateString(); }
set
{
Now25 = value;
OnPropertyChanged("Now25");
}
}
public string Now26
{
get { return FirstDate.AddDays(26).ToShortDateString(); }
set
{
Now26 = value;
OnPropertyChanged("Now26");
}
}
public string Now27
{
get { return FirstDate.AddDays(27).ToShortDateString(); }
set
{
Now27 = value;
OnPropertyChanged("Now27");
}
}
public string Now28
{
get { return FirstDate.AddDays(28).ToShortDateString(); }
set
{
Now28 = value;
OnPropertyChanged("Now28");
}
}
public string Now29
{
get { return FirstDate.AddDays(29).ToShortDateString(); }
set
{
Now29 = value;
OnPropertyChanged("Now29");
}
}
public string Now30
{
get { return FirstDate.AddDays(30).ToShortDateString(); }
set
{
Now30 = value;
OnPropertyChanged("Now30");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
View Model Code:
public class ButtonViewModel
{
private DateDataModel _dateModel;
public ButtonViewModel()
{
_dateModel = new DateDataModel();
}
public DateDataModel Dates
{
get { return _dateModel; }
set { _dateModel = value; }
}
private ICommand mUpdater;
public ICommand UpdateCommand
{
get
{
if (mUpdater == null)
mUpdater = new DateUpdater(this);
return mUpdater;
}
set
{
mUpdater = value;
}
}
private class DateUpdater : ICommand
{
#region ICommand Members
ButtonViewModel _obj;
public DateUpdater(ButtonViewModel obj)
{
_obj = obj;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (parameter == null) return;
Button clickedbutton = parameter as Button;
DateTime dt = DateTime.MinValue;
switch (clickedbutton.Name.ToString())
{
case "btnUpdate":
dt = Convert.ToDateTime(_obj.Dates.Now.ToString());
break;
case "btnUpdate1":
dt = Convert.ToDateTime(_obj.Dates.Now1.ToString());
break;
case "btnUpdate2":
dt = Convert.ToDateTime(_obj.Dates.Now2.ToString());
break;
case "btnUpdate3":
dt = Convert.ToDateTime(_obj.Dates.Now3.ToString());
break;
case "btnUpdate4":
dt = Convert.ToDateTime(_obj.Dates.Now4.ToString());
break;
case "btnUpdate5":
dt = Convert.ToDateTime(_obj.Dates.Now5.ToString());
break;
case "btnUpdate6":
dt = Convert.ToDateTime(_obj.Dates.Now6.ToString());
break;
case "btnUpdate7":
dt = Convert.ToDateTime(_obj.Dates.Now7.ToString());
break;
case "btnUpdate8":
dt = Convert.ToDateTime(_obj.Dates.Now8.ToString());
break;
case "btnUpdate9":
dt = Convert.ToDateTime(_obj.Dates.Now9.ToString());
break;
case "btnUpdate10":
dt = Convert.ToDateTime(_obj.Dates.Now10.ToString());
break;
case "btnUpdate11":
dt = Convert.ToDateTime(_obj.Dates.Now11.ToString());
break;
case "btnUpdate12":
dt = Convert.ToDateTime(_obj.Dates.Now12.ToString());
break;
case "btnUpdate13":
dt = Convert.ToDateTime(_obj.Dates.Now13.ToString());
break;
case "btnUpdate14":
dt = Convert.ToDateTime(_obj.Dates.Now14.ToString());
break;
case "btnUpdate15":
dt = Convert.ToDateTime(_obj.Dates.Now15.ToString());
break;
case "btnUpdate16":
dt = Convert.ToDateTime(_obj.Dates.Now16.ToString());
break;
case "btnUpdate17":
dt = Convert.ToDateTime(_obj.Dates.Now17.ToString());
break;
case "btnUpdate18":
dt = Convert.ToDateTime(_obj.Dates.Now18.ToString());
break;
case "btnUpdate19":
dt = Convert.ToDateTime(_obj.Dates.Now19.ToString());
break;
case "btnUpdate20":
dt = Convert.ToDateTime(_obj.Dates.Now20.ToString());
break;
case "btnUpdate21":
dt = Convert.ToDateTime(_obj.Dates.Now21.ToString());
break;
case "btnUpdate22":
dt = Convert.ToDateTime(_obj.Dates.Now22.ToString());
break;
case "btnUpdate23":
dt = Convert.ToDateTime(_obj.Dates.Now23.ToString());
break;
case "btnUpdate24":
dt = Convert.ToDateTime(_obj.Dates.Now24.ToString());
break;
case "btnUpdate25":
dt = Convert.ToDateTime(_obj.Dates.Now25.ToString());
break;
case "btnUpdate26":
dt = Convert.ToDateTime(_obj.Dates.Now26.ToString());
break;
case "btnUpdate27":
dt = Convert.ToDateTime(_obj.Dates.Now27.ToString());
break;
case "btnUpdate28":
dt = Convert.ToDateTime(_obj.Dates.Now28.ToString());
break;
case "btnUpdate29":
dt = Convert.ToDateTime(_obj.Dates.Now29.ToString());
break;
case "btnUpdate30":
dt = Convert.ToDateTime(_obj.Dates.Now30.ToString());
break;
}
System.Windows.MessageBox.Show(dt.ToString("ddd"));
}
Can somebody suggest me better approach for this one I believe we need to customize existing calendar
Upvotes: 0
Views: 93
Reputation: 2521
I would probably display an ItemsControl whose ItemsSource is a List of DateTime and make a DataTemplate on DateTime to display a button.
XAML:
<ItemsControl ItemsSource="{Binding ListOfDates, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DateTime}">
<Button Click="ClickHandler">
<TextBlock Text="{Binding StringFormat={}{0:D}}"/>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
back cs:
public void ClickHandler(Object sender, MouseEventArgs args) {
DateTime correspondingDate = (DateTime)((Button)sender).DataContext;
MessageBox.Show(CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(correspondingDate.DayOfWeek));
}
ViewModel:
public class YourVM {
public YourVM() {
int startYear = DateTime.Now.Year;
DateTime currentDate = new DateTime(startYear, 1, 1);
while(currentDate.Year == startYear) {
_listOfDates.Add(currentDate);
currentDate = currentDate.AddDays(1);
}
}
private List<DateTime> _listOfDates = new List<DateTime>(365);
public List<DateTime> ListOfDates { get { return _listOfDates; } }
}
Upvotes: 1