鉴于以下类别:
<!-- Want DataContext to be a NeighborhoodViewModel, not a Neighborhood -->
<NeighborhoodView>
<ListBox ItemsSource={Binding Houses}/>
<Button Content="Add House"/>
<Button Content="Remove House"/>
</NeighborhoodView>
<!-- Want DataContext to be a HouseViewModel, not a House-->
<HouseView>
<TextBox Text={Binding Address}/>
<ListBox ItemsSource={Binding Rooms}/>
<Button Content="Add Room"/>
<Button Content="Remove Room"/>
</HouseView>
<!-- Want DataContext to be a RoomViewModel, not a Room -->
<RoomView>
<ListBox ItemsSource={Binding Furniture}/>
<Button Content="Add Furniture"/>
<Button Content="Remove Furniture"/>
</RoomView>
我希望看起来像这样的观点:
public class NeighborhoodViewModel
{
public IEnumerable<Room> Rooms { get; }
public ICommand AddHouseCommand { get; }
public ICommand RemoveHouseCommand { get; }
}
但是,我不希望NeighborhoodViewModel包含HouseViewModel。相反,它应该是:
{{1}}
如何在XAML中声明与模型的绑定,但是将绑定转换为viewmodels?
答案 0 :(得分:1)
您可以通过两种方式创建此类效果。第一种方法是创建静态视图并在每个视图后面放置一个DataContext。这不是MVVM,其中ViewModel生成视图,但这将使您的绑定工作。这是一个观点的例子。
<Grid>
<HouseView x:Name="myHouse">
</HouseView>
</Grid>
在后面的代码中,您可以访问HouseView并设置数据上下文
public MainWindow()
{
myHouse.DataContext = new MyHouseViewModel();
}
这将使您的绑定适用于这些控件中的每一个。
我会说这不是WPF的最佳实践,它肯定不是开发大型项目的方法。然而,在我看来,这对于快速和脏的编码是有用的。您可以找到有关如何正确编写MVVM样式here的更多信息。