【发布时间】:2016-07-12 20:56:41
【问题描述】:
如果 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 数据绑定、视图模型、命令和模型类放在一起?
提前致谢! 真挚地, 我
【问题讨论】:
-
“应该没有后面的代码”并不意味着后面有零个代码;这意味着尽可能少。
-
确实如此。目标是避免代码隐藏,但不删除它。在工作中,我们避免使用事件处理程序等来支持附加属性和混合行为,但是对于几乎每个对话框,我们最终都会更改构造函数以将 ViewModel 作为唯一参数传递给对话框。并非所有代码隐藏都是不好的,但我们确实会积极尝试将其最小化。
-
我同意 WPF 中的代码隐藏在很多情况下少即是多,但这并不意味着完全消除它。标记的用处要多得多,但这里的相关部分之一是它大大减少了代码量,例如妨碍您关注的逻辑的字段。 WPF 中 Xaml 文件的使用非常类似于 C++ 中的头文件。
标签: wpf mvvm data-binding routed-commands xaml-resources