实例化ViewModel(需要simpleton帮助)



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构建阶段,还是将RegistersViewModelPropertyNamegetter实现为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!

最新更新