如何使用 WPF 和 MVVM 模式将数据从窗口获取到另一个窗口

本文关键字:窗口 获取 另一个 数据 WPF 何使用 MVVM 模式 | 更新日期: 2023-09-27 18:35:54

我构建了一个小任务应用程序,在我的第一个窗口中,我有一个我的任务列表,当我单击"创建"按钮时,它会打开带有文本框的新窗口,为新任务编写标题和内容。

我需要的是获取标题和内容写入我的第一个窗口的第二个窗口,以将这个新任务添加到我的列表中。

我的代码看起来像这样:

主视图模型 :

    public class MainViewModel : Notifyer
{
    ObservableCollection<Task> mTasks;
    public ObservableCollection<Task> Tasks { get { return this.mTasks; } set { this.mTasks = value; Notify("Tasks"); } }

    private ICommand m_ButtonAddCommand;
    public ICommand ButtonAddCommand { get { return m_ButtonAddCommand; } set { m_ButtonAddCommand = value; } }

    private ICommand m_ButtonDeleteCommand;
    public ICommand ButtonDeleteCommand { get { return m_ButtonDeleteCommand; } set { m_ButtonDeleteCommand = value; } }

    public MainViewModel()
    {
        ButtonAddCommand = new CommandHandler(() => add_task(), true);
        ButtonDeleteCommand = new CommandHandler(() => delete_task(), true);
        mTasks = new ObservableCollection<Task>();
        mTasks.Add(new Task("title1", "content1", true));
        mTasks.Add(new Task("title2", "content2", false));
    }
    private void add_task()
    {
        NewTaskWindow w = new NewTaskWindow();
        w.Show();
        //how to get my content ???
    }
    private void delete_task()
    {
    }
}

和新任务视图模型:

    public class NewTaskViewModel : Notifyer
{
    private ICommand m_ButtonAddCommand;
    public ICommand ButtonAddCommand { get { return m_ButtonAddCommand; } set { m_ButtonAddCommand = value; } }
    private String title;
    public String Title { get { return this.title; } set { this.title = value; Notify("Title"); } }
    private String content;
    public String Content { get { return this.content; } set { this.content = value; Notify("Content"); } }
    public NewTaskViewModel()
    {
        ButtonAddCommand = new CommandHandler(() => add_task(), true);
    }
    private void add_task()
    {
        Console.WriteLine(Title);
        Console.WriteLine(Content);
    }
}

如何使用 WPF 和 MVVM 模式将数据从窗口获取到另一个窗口

您不应该在视图内创建窗口,而应该使用依赖注入。要解决您的问题,请尝试以下操作:

private void add_task()
{
  NewTaskWindow w = new NewTaskWindow();
  var taskViewModel = ( NewTaskViewModel )w.DataContext;
  var title = taskViewModel.Title;
  var content = taskViewModel.Content;
  w.Show();
}

无需任何注入即可将模型传递到窗口中。没有必要。

WindowModel windowModel = new WindowModel();
Window window = new Window(windowModel);

内部窗口类

public Window(windowModel)
{
   DataContext = windowModel;
}

不要忘记删除此窗口的模型注入引用。