如果我有一个 Mainpage.xaml 文件并且我正在使用一个 viewmodelclass
代码应该在 Mainpage.xaml.cs 文件中吗?什么都没有?
您需要了解什么是视图以及视图模型的职责。 Codebehind 是 view 的一部分,所以只有被 view 的职责覆盖的代码才应该在 code behind 中。
有时在 xaml 中很难将数据绑定到视图模型(例如 PasswordBox)然后您可以使用代码隐藏来获取密码或捕获更改并在视图模型中设置属性。您不应该在代码隐藏中针对服务器验证密码。
有时很难在 xaml 中定义动画。随意在 C# 中创建或触发它们(但在这种情况下,您将无法在 Expression Blend 中进行编辑)
可以在代码隐藏中使用 Loaded / Unloaded 之类的偶数,例如我使用它们在我的视图模型中调用激活/停用方法。
这是代码隐藏示例,不违反视图和视图模型的关注点分离:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Closing += MainWindow_Closing;
}
MainWindowViewModel ViewModel
{
get { return (MainWindowViewModel)DataContext; }
}
void MainWindow_Closing(object sender, CancelEventArgs e)
{
var canExit = ViewModel.ShowConfirmExitDlg();
if (!canExit) e.Cancel = true;
}
}
换句话说,有时您必须使用代码隐藏。有人说你永远不应该使用它,而是要务实并在它对你有帮助的时候使用它。
那段代码是否应该在 Mainpage.xaml.cs 文件中:Viewmodel base = new Viewmodel();
是的,没关系。但是,您应该在 xaml 中使用 d:DataContext 以便让 Visual Studio 设计器知道您正在使用什么数据上下文,以便它可以为您提供智能感知和设计时支持。有很多方法可以设置实例视图模型并将其设置为数据上下文。任你选择。
如果我实现 ICommands,我如何访问 Mainpage.xaml 上的 textbox.text?
在视图模型中创建字符串属性并将 textbox.text 数据绑定到它。使用 DelegateCommand,您可以在其中传递有权访问该属性的方法:
public class MainWindowViewModel
{
public MainWindowViewModel()
{
LoginCommand = new DelegateCommand(Login);
}
public DelegateCommand LoginCommand { get; private set; }
public string Username { get; set; }
public string Password { get; set; }
private void Login()
{
if (Username == "user" && Password == "user")
{
}
}
}
仅供参考,还有另一种将参数传递给命令的方法:检查命令参数功能[link]
ICommands 完全取代了 Button.Click 事件?不是吗?
几乎。与第一个问题的答案相同的规则也适用于此。