Wpf 如何在Window.Resources标记中使用具有数据绑定的viewmodel、model和command类?
如果WPF MVVM应该没有代码隐藏,为什么在使用ICommand时,需要在Window.xaml.cs代码隐藏中实例化DataContext属性?我看了YouTube WPF MVVM、数据绑定、ICommand、iNotifyProperty更改的视频,并对这些视频进行了跟踪,我感到困惑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();
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();
}
}