MVVM理解问题

本文关键字:问题 MVVM | 更新日期: 2023-09-27 18:10:07

我对mvvm的问题列表,你不需要自己回答,帮助我进一步的链接总是很感激:

  1. 如果我有主页。xaml文件,我使用viewmodelclass哪些代码应该在Mainpage.xaml.cs文件?没有什么?

  2. 这段代码应该在mainpage . example .cs文件中吗?

  3. 如果我实现iccommands,我如何访问例如一个文本框。在Mainpage.xaml?

  4. iccommands完全取代了Button。单击事件吗?不是吗?

MVVM理解问题

  1. 如果我有一个主页。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文件中吗?

  • 是的,没关系。然而,你应该在xaml中使用d:DataContext,以便让Visual Studio Designer知道你正在使用什么数据上下文,以便它可以为你提供智能感知和设计时支持。有很多方法可以设置实例视图模型并将其设置为数据上下文。这取决于你的选择。

  • 如果我实现iccommands,我如何访问例如一个文本框。在Mainpage.xaml?

  • 在视图模型中创建字符串属性并绑定文本框。给它发短信。使用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]

  • iccommands完全取代了Button。单击事件吗?不是吗?

  • 。与回答第一个问题相同的规则也适用于此。

    1. 理想情况下,是的。但在大多数情况下,很难遵循
    2. 并非所有情况都是如此。如果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}" />
    
  • 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内的文本框的文本操作。

  • 是的。命令也允许传递参数到iccommand(例如,当你将使用RelayCommand)
  • 希望,这有帮助。

    1. 我尽量将代码保留到最小。我还是倾向于把表单关闭逻辑放在那里

    2. 许多人使用依赖注入从WPF表单外部完成此操作。

    3. 你可以在文本框的视图模型上使用数据绑定属性。文本(使用INotifyPropertyChanged)并在ViewModel中修改它。表单将自动更新以反映任何更改。

    4. 是的,它将代码从表单抽象到视图模型。

    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处理事情的方式过渡。仅仅因为框架支持它,并不意味着它是正确的处理事情的方式。