如何在XAML中将模型投影到视图模型中?

时间:2016-04-19 18:15:37

标签: c# wpf xaml mvvm

鉴于以下类别:

<!-- 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?

1 个答案:

答案 0 :(得分:1)

您可以通过两种方式创建此类效果。第一种方法是创建静态视图并在每个视图后面放置一个DataContext。这不是MVVM,其中ViewModel生成视图,但这将使您的绑定工作。这是一个观点的例子。

<Grid>
    <HouseView x:Name="myHouse">

    </HouseView>
</Grid>

在后面的代码中,您可以访问HouseView并设置数据上下文

public MainWindow()
{
    myHouse.DataContext = new MyHouseViewModel();
}

这将使您的绑定适用于这些控件中的每一个。

我会说这不是WPF的最佳实践,它肯定不是开发大型项目的方法。然而,在我看来,这对于快速和脏的编码是有用的。您可以找到有关如何正确编写MVVM样式here的更多信息。