Wpf 如何在Window.Resources标记中使用具有数据绑定的viewmodel、model和command类?

Wpf 如何在Window.Resources标记中使用具有数据绑定的viewmodel、model和command类?,wpf,mvvm,data-binding,routed-commands,xaml-resources,Wpf,Mvvm,Data Binding,Routed Commands,Xaml Resources,如果WPF MVVM应该没有代码隐藏,为什么在使用ICommand时,需要在Window.xaml.cs代码隐藏中实例化DataContext属性?我看了YouTube WPF MVVM、数据绑定、ICommand、iNotifyProperty更改的视频,并对这些视频进行了跟踪,我感到困惑 public partial class MainWindow : Window { public MainWindow() { InitializeComponent();

如果WPF MVVM应该没有代码隐藏,为什么在使用ICommand时,需要在Window.xaml.cs代码隐藏中实例化DataContext属性?我看了YouTube WPF MVVM、数据绑定、ICommand、iNotifyProperty更改的视频,并对这些视频进行了跟踪,我感到困惑

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel.VM_CalcRblAmt();
    }
}
如何使用具有数据绑定的视图模型、模型、命令类 在窗口中。资源标签?如果这是正确的mvvm模式?下面的窗口中有类似的内容(但不起作用)。资源标记? 我这样问是因为在不同作者的WPF MVVM教程中并排讨论,我看不到如何将视图模型、模型和命令类插入UI(本例中为窗口)中的xml名称空间。例如:

<Window...
         xmlns:nsviewmodel="clr-namespace:Wpf_MVVVM_Rbr.ViewModel" />
<Window.Resources>
<nsrbrvm:RbrCoreViewModel x:Key="objRbrTemp"
  <Button x:Name="btnRebalancer" 
     Command="{Binding CalcRbrAmtCommand}" 
     Content="Rebalance"/>
  <TextBox x:Name="txtAmtDaily" Text="{Binding model_Rblr_Temp.AmtDaily, UpdateSourceTrigger=PropertyChanged}" />
</Window.Resources>


一,。如果WPF MVVM应该没有代码隐藏,为什么在使用ICommand时,需要在Window.xaml.cs代码隐藏中实例化DataContext属性? 设置DataContext的方法有很多:

第一种方法。在视图中:

<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
第三种方法。在Windows的构造函数中:

public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
第四种方法。您可以通过UnityContainer的DependencyInjection设置DataContext。但DependencyInjection、Prism和UnityContainer是其他问题,它们超出了问题的范围。举个例子:

protected override void RegisterTypes()
{ 
    unityContainer.RegisterType<object, ItemControl>("ModuleAUpper");
    unityContainer.RegisterType<IViewModelItemControl, ViewModelItemControl>();
    unityContainer.RegisterTypeForNavigation<ItemControl>();
}
和XAML:

MVVM范围内的绑定
按钮

<Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/>
更新:

我建议你读我读过的最好的一本。

谢谢,加油

第一部分你的答案我得到了第一和第二的工作!我使用第一种方法来避免任何代码落后。第三个我确信是有效的,也许是我错过了一些你以为我知道的东西。但方法一是我一直在寻找的!谢谢当我熟悉该类时,我将花一些时间尝试使用和理解方法4 UnityContainer.Registry类型。
第二部分,我还没有反向工程和应用。有了ICommand界面,我从youTube教程视频中获取了ICommand。但一旦我使用了你的代码,我会回到这里感谢你。

“应该没有代码落后”并不意味着零代码落后;这意味着尽可能少。的确。目标是避免代码隐藏,但不是删除它。在工作中,我们避免使用事件处理程序等来支持附加属性和混合行为,但对于几乎每个对话框,我们最终都会更改构造函数,将ViewModel作为对话框的唯一参数传入。并不是所有的代码隐藏都是不好的,但我们确实积极尝试将其最小化。我同意在很多情况下,WPF中的代码隐藏越少越好,但这也不意味着完全消除它。标记有更多的用处,但这里的一个相关部分是,它大大减少了代码量,例如字段,这些字段会妨碍您想要关注的逻辑。XAML文件在WPF中的使用非常类似于C++中的头文件。谢谢StepUp。在对代码进行反向工程后,我将更详细地进行注释。
private string message="helloWorld";    

public string Message
{
    get { return message;}
    set { message = value;}
}
<Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/>
private ICommand _clickCommand;
public ICommand ClickCommand
{
   get
   {
     return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute));
   }
}
private bool _canExecute;

public class CommandHandler : ICommand
{
  private Action _action;
  private bool _canExecute;
  public CommandHandler(Action action, bool canExecute)
  {
      _action = action;
      _canExecute = canExecute;
  }

  public bool CanExecute(object parameter)
  {
     return _canExecute;
  }

  public event EventHandler CanExecuteChanged;

  public void Execute(object parameter)
  {
     _action();
  }
}