本质上,MVVM 或 Model、View、ViewModel 背后的理念是删除背后的代码并分离出应用程序的各个层,以便它们可以独立工作。您的 GUI 或视图与 Viewmodel 或代码隐藏之间的交互并没有像您想象的那样发生。很多人对视图模型如何与 gui 或视图进行交互感到困惑。我是一名 winforms 开发人员,拥有代码隐藏文件,您可以在其中轻松查看隐藏代码中的事件处理程序并在逻辑上遵循代码。在您将 XAML gui 的数据上下文设置为视图模型的 MainWindow 代码中,如下所示。
public partial class MainWindow : Window
{
#region Members
SongViewModel _viewModel;
int _count = 0;
#endregion
public MainWindow()
{
InitializeComponent();
// We have declared the view model instance declaratively in the xaml.
// Get the reference to it here, so we can use it in the button click event.
_viewModel = (SongViewModel)base.DataContext;
}
private void ButtonUpdateArtist_Click(object sender, RoutedEventArgs e)
{
++_count;
_viewModel.ArtistName = string.Format("Elvis ({0})", _count);
}
}
然后 {Binding Path=Property} 将 _viewModel 的属性连接到 XAML 元素。添加 RaisePropertyChanged 是通知 gui 该属性的值已更改。
public string ArtistName
{
get { return Song.ArtistName; }
set
{
if (Song.ArtistName != value)
{
Song.ArtistName = value;
RaisePropertyChanged("ArtistName");
}
}
}
View 模型的 ArtistName 属性绑定到标签,就像在 XAML 中一样
这或多或少是您在 gui 和代码之间的交流。因此,例如在您的第一个示例中,当您将文本框从 0 更改为 1 时,就会更新 ViewModel 中的 ProductID 属性。您可以在您的 ICommand GetProductCommand 中看到有一个参数被传递给 relayCommand 用于 ProductID > 0。现在它的 1 canexecute 为真,因此该命令现在可以执行并且按钮变为可点击。当您单击它时,GetProduct 是发生的操作,然后该方法将您的 CurrentProduct 属性设置为值。产品信息的 Datatemplate 绑定到 xaml 中的 ProductModel,ProductModel 绑定到 CurrentProduct,因此现在在该数据模板中 CurrentProduct 的属性可以绑定到 xaml 元素,因此 CurrentProduct.ProductName 或绑定到
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding ProductName}" />
起初它令人困惑,但当你掌握它时,它会完全有意义。