【问题标题】:Fire command from custom canvas来自自定义画布的触发命令
【发布时间】:2013-12-26 21:27:29
【问题描述】:

我使用 MVVM 模式开发应用程序。在我的视图模型项目中,我有自定义命令。在视图中我有自定义画布。 我想从我的画布代码中触发命令,但我不知道如何。

我的应用启动(启动在其他项目中):

private void ApplicationStartup(object sender, StartupEventArgs e)
{
   // init main ViewModel
   var viewModel = new MainViewModel(Container);
   // init and show window
   var mainWindow = new MainWindow();
   mainWindow.Show();
   mainWindow.DataContext = viewModel;
}

我不想在 View 中引用 ViewModel,因为我需要在 ViewModel 中引用 View。

谢谢!

【问题讨论】:

    标签: c# wpf canvas mvvm


    【解决方案1】:

    您通常执行此操作的方式是在 CustomCanvas 类中实现您自己的 COMMAND。之后,将该命令与视图模型中的命令处理程序绑定。

    就像你用按钮做的那样:

    <Button
      Command="{Binding YourVmCommand}"
    />
    

    有道理吗?

    要实现这样的功能,您需要破解 ButtonBase.cs 并查看它是如何完成的。 涉及很多代码,但想法非常简单。

    1) 在您的视图中创建新属性。

    public ICommand Command { get; set; }
    

    2) 在 XAML 中绑定到它

    3) 在需要时在 View 中执行。

    if(Command != null && Command.CanExecute(parameter))
      Command.Execute(parameter);
    

    【讨论】:

    • 感谢您的回答。但我不需要 xaml。我想在画布中直接将事件拖放到视图模型后触发命令。那可能吗?也许我知道你的解决方案不好......
    • 是的,你可以这样做,只是不能重复使用。如果您不关心它,那么您只需使用 (YourCanvas.DataContext as MainViewModel).YourCommand();如果你不想死,那么你可以使用 ((dynamic)(YourCanvas.DataContext)).YourCommand() :P
    • 或者(YourCanvas.DataContext as MainViewModel).YourCommand.Execute()
    • 我明白了,我知道,但在这个解决方案中,我必须从 View 中引用 Viewmodel……也许我的想法绝对不好。因为我想在 Viewmodel 和 Viewmodel 中引用 View 我想在我的画布上保留组件列表。并且每个组件都有来自其他 Viewmodel 集合的项目的引用实例。这是我的第一个 MVVM 应用程序,我不知道如何正确操作。
    • 是的,我听到你说的了,但是如果你想关注 MVVM,那么 ViewModel 对 View 什么都不知道。重构您的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多