按钮点击事件是由后面的代码还是视图模型处理的? MVVM

时间:2013-10-05 00:18:24

标签: c# mvvm windows-phone-8

想象一下,我有一个用户名和密码文本框和一个按钮来提交登录详细信息。

我有一个班级:

public class LoginCredentials
{
    public string Username { get; set; }
    public string Password { get; set; }
}

我有一个视图模型:

public class MainViewModel : INotifyPropertyChanged
{
    public LoginCredentials LoginCredentials { get; set; }

    public MainViewModel( LoginCredentials loginCredentials )
    {
        // Implement loading from saved credentials if done so
        this.LoginCredentials = new LoginCredentials();
    }

    #region Properties
    public string Username {
        get { return LoginCredentials.Username; }
        set { LoginCredentials.Username = value; }
    }
    public string Password
    {
        get { return LoginCredentials.Password; }
        set { LoginCredentials.Password = value; }
    }
    #endregion

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我有一些xaml与此视图模型的数据绑定:

...DataContext="{Binding MainViewModel}"...     
   <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0">
        <TextBlock HorizontalAlignment="Left" Margin="10,0,0,0" TextWrapping="Wrap" Text="Username" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Height="72" Margin="0,27,0,0" TextWrapping="Wrap" Text="{Binding Username, Mode=TwoWay}" VerticalAlignment="Top" Width="456"/>
        <TextBlock HorizontalAlignment="Left" Margin="10,99,0,0" TextWrapping="Wrap" Text="Password" VerticalAlignment="Top"/>
        <PasswordBox HorizontalAlignment="Left" Height="72" Margin="0,126,0,0" Password="{Binding Password, Mode=TwoWay}" VerticalAlignment="Top" Width="456"/>

        <Button Content="Log in" HorizontalAlignment="Center" Margin="167,203,169,0" VerticalAlignment="Top" />

    </Grid>

最后,我的代码落后于xaml:

public partial class MainPage : PhoneApplicationPage
{
    // Constructor

    public MainPage()
    {
        InitializeComponent();
        base.DataContext = new MainViewModel();
    }
}

我在哪里放置更新我在我的viewmodel中声明的LoginCredentials的click事件,然后我将其提交给我的DomainModel(在本例中是一个服务层)。

如果我添加一个绑定到我的viewmodel中的函数的click事件,我不知道用户名和密码的文本框字段是什么,因为viewmodel无法访问Username.text类的方法。

我是否在按钮后面的代码中添加了一些notifypropertychanged? yellllp。这是我的第一个Windows手机应用程序。

1 个答案:

答案 0 :(得分:2)

  

我在哪里放置更新我在我的viewmodel中声明的LoginCredentials的click事件,然后我将其提交给我的DomainModel(在本例中是一个服务层)。

通常情况下,你不会这样做。相反,您需要在ICommand中添加ViewModel,并将Button的Command绑定到ICommand。这允许您将逻辑解耦并将其完全放在ViewModel中,并仍然使用绑定来调用它。

ICommand通常通过某种形式的DelegateCommand实现,例如this implementation for Windows Phone

  

我无法知道用户名和密码的文本框字段是什么,因为viewmodel无法访问Username.text类方法。

这些绑定到ViewModel中的属性,因此更改将自动反映在那里。