MVVM的新手,它点击到位,但我似乎有知识/概念差距...
我的MainWindow显示项目列表:
<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&lt;&gt;来将数据放入RegistersView中的ListView中。并将上面的行改为
<vw:RegistersView DataContext="{Binding PropertyNameOfCollectionForListView}" Grid.Row="1" />
看起来MVVM(更不用说显而易见)也为RegistersView创建一个ViewModel ......但是我缺乏对如何以非常基本的方式连接它的洞察力。我知道我可以使用Unity,Prism和所有其他人使用IOC / DI但是......我有吗?我真正想要的是能够公开Registers-View特定属性以与模型交互并定义要绑定的命令等。
我觉得我想说
<vw:RegistersView viewmodel="RegistersViewModel(PropertyNameOfCollectionForListView)" />
有人可以指出我正确的方向吗 - 我已阅读,阅读和阅读,但我错过了。
感谢您的耐心等待; - &gt;
答案 0 :(得分:0)
您的MainWindowViewModel
可以公开RegistersViewModel
类型的属性,然后您可以将其绑定到XAML中的RegisterView.DataContext
,如下所示:
<vw:RegistersView Grid.Row="1"
DataContext="{Binding RegistersViewModelPropertyName}" />
显然RegistersViewModelPropertyName
应该引用已经实例化的RegistersViewModel
。这取决于你如何做到这一点,无论是在MainViewModel
构建阶段还是实施RegistersViewModelPropertyName
getter都是懒惰的。
答案 1 :(得分:0)
似乎非常MVVM(更不用说显而易见)也创建了一个ViewModel 对于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;}
}
然后将usercontrol绑定到此属性:
在此用户控件的XAML中绑定到列表和命令
<UserControl x:Class="RegistersView" ... >
<ListView ItemsSource={Binding Path=RegisterViewModelCollection}/>
<Button Content="Add" Command="{Binding Path=AddRegister}"/>
</UserControl>
不,这不需要任何DI或IoC!