2

如果 WPF MVVM 应该没有代码背后,为什么在使用 ICommand 时,是否需要在 Window.xaml.cs 代码中实例化 DataContext 属性?我已经并排观看并关注了 YouTube WPF MVVM、数据绑定、ICommand、INotifyPropertyChanged 视频,我很困惑。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel.VM_CalcRblAmt();
    }
}

如何在 Window.Resource 标签中使用带有数据绑定的视图模型、模型、命令类?如果那是正确的 mvvm 模式?Window.Resource 标记中的以下内容(但不起作用)?我问这个是因为在不同作者的 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>

同样,上面的代码目前实际上不在 Window.Resources 标记之间。它位于 Window.Resources 标记之外的 UI XAML 代码中。目前确实有效。但是 MVVM 模式是否不需要在 Window.Resources 或 Page.Resources 标签中引用 xmlns 命名空间并为其赋予 x:Key="someKeyName" 并在 Resources 标签内使用数据绑定?

因此,如果这正确的 MVVM 实践,我如何使用数据绑定将 Window.Resources 数据绑定、视图模型、命令和模型类放在一起?

提前致谢!真诚的,我

4

2 回答 2

3

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

第一种方法。鉴于:

<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>

第二种方法。您应该覆盖 App.xaml.cs 的 OnStartUp() 方法

public partial class App : Application
{
     protected override void OnStartup(StartupEventArgs e)
    {
            base.OnStartup(e);
            MainWindow app = new MainWindow();
            ProductViewModel context = new ProductViewModel();
            app.DataContext = context;
            app.Show();
     }
}

第三种方法。在 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>();
}

2、如何在Window.Resource标签中使用带有数据绑定的视图模型、模型、命令类?如果那是正确的 mvvm 模式?Window.Resource 标记中的以下内容(但不起作用)?

资源只是存储数据的机会。 要设置 viewModel 和 XAML 中的属性之间的绑定,您应该:

private string message="helloWorld";    

public string Message
{
    get { return message;}
    set { message = value;}
}

和 XAML:

ButtonMVVM 范围内的绑定:

<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();
  }
}

更新:

我建议你阅读我读过的Rachel Lim 最好的 MVVM 教程

于 2016-03-25T06:22:41.967 回答
1

谢谢,步步高!

你的答案的第一部分我得到了第一和第二的工作!我正在使用第一种方法来避免后面的任何代码。第三个我肯定会工作,只是也许我错过了一些你认为我知道的东西。但是方法一是我想要的!谢谢。当我熟悉该类时,我将花一些时间尝试使用和理解方法 4,UnityContainer.Registry 类型。您赞赏的答案,问题的第 2 部分,我还没有逆向工程和应用。通过 ICommand 界面,我一直在使用 ICommand 以及从 YouTube 教程视频中获取的内容。但是,一旦我使用您的代码,我会在这里感谢您。

于 2016-04-10T04:35:55.673 回答