基本的MVVM应用程序

时间:2016-02-14 18:55:34

标签: c# mvvm

我已阅读了多个教程,但大多数教程都以某种方式解释它,就像每个人都有MVVM经验一样。我知道像Model,ViewModel等基础知识。

现在我想创建一个包含FirstNameLastName的简单应用程序以及我希望稍后显示FullName的标签。

从Persons Class开始:

public class Student
{
    public string FirstName { set; get; }
    public string LastName { set; get; }


    public string FullName
    {
        get
        {
            return this.FirstName + " " + this.LastName;
        }
    }
}

这应该是正确的,对吧?

我的ViewModel如下所示:

public class StudentViewModel : ViewModelBase
{
    private Student _Student = new Student();

    public string FirstName
    {
        get { return _Student.FirstName; }
        set
        {
            _Student.FirstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    public string LastName
    {
        get { return _Student.LastName; }
        set
        {
            _Student.LastName = value;
            NotifyPropertyChanged("LastName");
        }
    }

    public string FullName
    {
        get { return _Student.FullName; }
    }

}

这也是正确的吗?

最后但并非最不重要:

按下按钮时,如何实际显示FullName

2 个答案:

答案 0 :(得分:1)

如你所说,你是MVVM的新手,在这种情况下你的代码是好的, 但我会为“学生”课提出不同的方法;

public class Student
{
    private string _firstName;
    private string _lastName;
    public Student(string firstName, string lastName)
    {
        _firstName = firstName;
        _lastName = lastName;
    }

    public string FullName
    {
        get
        {
            return _firstName + " " + _lastName;
        }
    }
}

您的viewmodel类没问题。

要按下按钮上显示全名,您需要注册“按钮点击事件”或“按钮命令”。

您可以在.xaml文件中创建标签,并在视图模型中使用“全名”属性进行绑定。 还可以在viewmodel中使用命令绑定你的按钮,如。

在.xaml文件中      像这样修改视图模型

public class StudentViewModel : ViewModelBase
{
    public StudentViewModel 
    {
       ButtonCommand = //Initilaize it with relay command class.
    }
    //... Other stuff goes here

    ICommand ButtonCommand { get; private set; }

    private  void OnButtonCommand()
    {
       NotifyPropertyChanged("FullName");
    }

}

答案 1 :(得分:0)

正如@Tim在评论中所说,您需要从每个可能导致NotifyPropertyChanged("FullName")更改的属性设置器中调用FullName(在这种情况下,FirstNameLastName )。

这将导致:

public string FirstName
{
    get { return _Student.FirstName; }
    set
    {
        _Student.FirstName = value;
        NotifyPropertyChanged("FirstName");
        NotifyPropertyChanged("FullName");
    }
}

public string LastName
{
    get { return _Student.LastName; }
    set
    {
        _Student.LastName = value;
        NotifyPropertyChanged("LastName");
        NotifyPropertyChanged("FullName");
    }
}

通过上述更改,如果您只想显示基于名字和姓氏的全名,则不需要按钮。你真正需要做的就是在你的XAML中有一个绑定到FullName的TextBlock,如下所示:

<TextBlock Text="{Binding FullName}" />

随着名字或姓氏的更新,将立即发送通知,导致TextBlock更新为新的FullName

你对这个按钮有什么想法?按下它会发生什么?

根据OP的评论,我添加了一个如何使用Button的示例。

首先将您的XAML更改为:

<TextBlock Text="{Binding FullName}" Visibility="{Binding FullNameVisibility}" />
<Button Content="Display Full Name" Command="{Binding ShowFullNameCommand}" />

其次,将您的视图模型更改为:

public Visibility FullNameVisibility { get; private set; }
public ICommand ShowFullNameCommand { get; private set; }

public StudentViewModel(Student student)
{
    _Student = student;
    FullNameVisibility = Visibility.Hidden;
    ShowFullNameCommand = new RelayCommand(() => FullNameVisibility = Visibility.Visible);
}

启动应用时,系统会隐藏全名。当用户单击该按钮时,将显示全名。

请注意,这假设您使用的是MVVM Light(具有RelayCommand)。如果您使用的是其他MVVM库,那么该命令可能会被调用。