想象一下,我有一个用户名和密码文本框和一个按钮来提交登录详细信息。
我有一个班级:
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手机应用程序。
答案 0 :(得分:2)
我在哪里放置更新我在我的viewmodel中声明的LoginCredentials的click事件,然后我将其提交给我的DomainModel(在本例中是一个服务层)。
通常情况下,你不会这样做。相反,您需要在ICommand
中添加ViewModel
,并将Button的Command
绑定到ICommand
。这允许您将逻辑解耦并将其完全放在ViewModel中,并仍然使用绑定来调用它。
ICommand
通常通过某种形式的DelegateCommand实现,例如this implementation for Windows Phone。
我无法知道用户名和密码的文本框字段是什么,因为viewmodel无法访问Username.text类方法。
这些绑定到ViewModel中的属性,因此更改将自动反映在那里。