MVVM的新手,它很到位,但我似乎有知识/概念差距。。。
我的主窗口显示项目列表:
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<vw:HeaderView Grid.Row="0" />
<vw:RegistersView Grid.Row="1" />
<vw:LogView Grid.Row="2" />
</Grid>
MainWindowViewModel创建主数据存储库。
RegistersView有一个对象的ListView(除其他外),并负责编辑值。我可以通过公开ObservableCollection<>将数据获取到RegistersView中的ListView中并将上述行更改为
<vw:RegistersView DataContext="{Binding PropertyNameOfCollectionForListView}" Grid.Row="1" />
还为RegistersView创建ViewModel似乎非常MVVM(更不用说显而易见的了)。。。但我对如何以一种非常基本的方式将其连接起来缺乏洞察力。我知道我可以使用Unity、Prism和所有其他方式使用IOC/DI,但。。。我有吗?实际上,我想要的只是能够公开寄存器视图特定的属性来与模型交互,并定义要绑定的命令等。
我觉得我想说
<vw:RegistersView viewmodel="RegistersViewModel(PropertyNameOfCollectionForListView)" />
有人能给我指正确的方向吗?我读了又读,但我错过了。
感谢您的耐心等待;->
您的MainWindowViewModel
可以公开RegistersViewModel
类型的属性,然后您可以将其绑定到XAML中的RegisterView.DataContext
,如下所示:
<vw:RegistersView Grid.Row="1"
DataContext="{Binding RegistersViewModelPropertyName}" />
显然,RegistersViewModelPropertyName
应该引用已经实例化的RegistersViewModel
。如何做到这一点取决于您,无论是在MainViewModel
构建阶段,还是将RegistersViewModelPropertyName
getter实现为lazy。
创建ViewModel似乎非常MVVM(更不用说显而易见的)对于RegistersView
我完全同意,这感觉很像MVVM。因此,目前您的MainWindowViewModel
如下所示:
class MainWindowViewModel
{
public ObservableCollection<RegisterViewModel> PropertyNameOfCollectionForListView {get; set;}
}
为什么不创建一个视图模型,将暴露在UI中的项目集合及其命令封装在一起呢。因此,新的视图模型可能看起来像这样:
public class RegistersViewModel
{
public ObservableCollection<RegisterViewModel> RegisterViewModelCollection {get; set;}
public ICommand AddRegister { get; set; }
public ICommand RemoveRegister { get; set; }
}
即,它仍然公开原始集合,但现在添加了与该集合相关的命令。
您的MainWindowViewModel
现在公开了这个新的视图模型:
class MainWindowViewModel
{
public RegistersViewModel RegistersViewModelProperty {get; set;}
}
然后将您的用户控件绑定到此属性:
并且在该用户控件的XAML中绑定到列表和命令
<UserControl x:Class="RegistersView" ... >
<ListView ItemsSource={Binding Path=RegisterViewModelCollection}/>
<Button Content="Add" Command="{Binding Path=AddRegister}"/>
</UserControl>
不,这不需要任何DI或IoC!