簡體   English   中英

使用MVVM的WPF應用程序

[英]WPF Application Using MVVM

問題:使用MVVM創建一個簡單的WPF應用程序,該應用程序應在當年的每一天顯示一個按鈕並顯示一個日期,然后單擊按鈕應顯示帶有星期幾名稱的消息。

解決方案:我已經創建了該應用程序並成功運行,但是從代碼角度來看它看起來並不出色。

型號代碼:

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));
    }


}

}

查看型號代碼:

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"));
        }

有人可以建議我為這種方法提供更好的方法嗎,我認為我們需要自定義現有日歷

我可能會顯示ItemsItem是DateTime列表的ItemsControl,並在DateTime上創建一個DataTemplate來顯示一個按鈕。

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>

返回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; } }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM