MVVM理解问题
本文关键字:问题 MVVM | 更新日期: 2023-09-27 18:10:07
我对mvvm的问题列表,你不需要自己回答,帮助我进一步的链接总是很感激:
-
如果我有主页。xaml文件,我使用viewmodelclass哪些代码应该在Mainpage.xaml.cs文件?没有什么?
-
这段代码应该在mainpage . example .cs文件中吗?
-
如果我实现iccommands,我如何访问例如一个文本框。在Mainpage.xaml?
- iccommands完全取代了Button。单击事件吗?不是吗?
-
如果我有一个主页。xaml文件,我使用的是viewmodelclass代码应该在mainpage . example .cs文件?没有什么?
你需要理解什么是视图的,什么是视图模型的职责。代码隐藏是视图的一部分,所以只有被视图职责覆盖的代码才应该在代码隐藏中。
有时在xaml中很难绑定到viewmodel(例如PasswordBox),然后你可以使用代码隐藏来获取密码或捕获更改并设置viewmodel中的属性。您不应该在代码隐藏中验证密码。
有时候在xaml中定义动画是很困难的。你可以自由地在c#中创建或触发它们(但在这种情况下,你无法在Expression Blend中编辑它们)在代码背后使用像Loaded/Unloaded这样的even是ok的,例如,我用它们来调用我的视图模型中的Activate/Deactivate方法。
这是一个代码隐藏示例,它没有违反视图和视图模型分离的关注:
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 . example .cs文件中吗?
如果我实现iccommands,我如何访问例如一个文本框。在Mainpage.xaml?
iccommands完全取代了Button。单击事件吗?不是吗?
是的,没关系。然而,你应该在xaml中使用d:DataContext,以便让Visual Studio Designer知道你正在使用什么数据上下文,以便它可以为你提供智能感知和设计时支持。有很多方法可以设置实例视图模型并将其设置为数据上下文。这取决于你的选择。
在视图模型中创建字符串属性并绑定文本框。给它发短信。使用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")
{
}
}
}
仅供参考,还有另一种传递参数到命令的方法:检查CommandParameter功能[link]
。与回答第一个问题相同的规则也适用于此。
- 理想情况下,是的。但在大多数情况下,很难遵循
-
并非所有情况都是如此。如果ViewModel的构造函数不接受参数,可以用xaml:
<Window.Resources> <local:ViewModel x:Key="viewModel" /> <!-- this row will automatically create instance of ViewModel class--> </Window.Resources>
如果视图模型类接受参数,那么是的,你将不得不写:
ViewModel base = new Viewmodel(yourArgs);
this.DataContext = base;
在后台代码。如果你想遵循MVVM,将TextBox的Text属性绑定到Viewmodel属性:
<TextBox Text="{Binding MyText}" />
- 是的。命令也允许传递参数到iccommand(例如,当你将使用RelayCommand)
and in ViewModel:
private string _myText;
public string MyText
{
get { return _myText; }
set
{
if (_myText != value)
{
_myText = value;
// NotifyPropertyChanged("MyText"); if needed
}
}
}
然后你可以使用RelayCommand或DelegateCommand(谷歌它)与ViewModel内的文本框的文本操作。
希望,这有帮助。
-
我尽量将代码保留到最小。我还是倾向于把表单关闭逻辑放在那里
-
许多人使用依赖注入从WPF表单外部完成此操作。
-
你可以在文本框的视图模型上使用数据绑定属性。文本(使用INotifyPropertyChanged)并在ViewModel中修改它。表单将自动更新以反映任何更改。
-
是的,它将代码从表单抽象到视图模型。
YouTube上有一些很棒的视频详细解释了这些概念。
希望这对你有帮助。
我认为你的问题表明你还没有真正开始深入研究使用MVVM的WPF。
大多数"入门"教程都会解决你的问题。我最喜欢的教程是Josh Smith的WPF Apps With The Model-View-ViewModel设计模式。
它会给你所有问题的有效答案。不要忘记下载本文的代码示例,以获得完整的演示应用程序!: -)
这个问题可能会因为不够具体而被删除但是不管怎样....
如果我有一个主页。xaml文件,我使用的是viewmodelclass代码应该在mainpage . example .cs文件?没有什么?
不只是MainPage,任何其他窗口或控件类也可以(有一些例外,我不在这里讨论)。您应该能够在不创建单个视图的情况下创建、运行和单元测试整个应用程序。视图模型是你的应用程序,视图只是松散绑定的图形UI表示呈现给你的用户,当你以一种需要用户交互的方式运行你的应用程序(即不是单元测试)。
Viewmodel base = new Viewmodel();
这是一个有点复杂的话题,但高层次的答案是"使用依赖注入框架"。通过NuGet将MVVM Lite添加到您的项目中,将自动为您设置一个非常简单的框架,否则谷歌是您的朋友。
如果我实现iccommands,我如何访问例如textbox.text在主页。xaml?
用getter和setter给视图模型添加一个字符串属性,并将文本框的Text属性绑定到该属性。
iccommands完全取代了Button。单击事件吗?不是吗?
一般来说,是的。使用WPF的"正确"方法是将命令绑定到命令处理程序。添加事件处理程序的原因与添加属性getter和setter的原因相同,即帮助从旧的WinForms处理事情的方式过渡。仅仅因为框架支持它,并不意味着它是正确的处理事情的方式。