使用MVVM绑定嵌套列表

时间:2015-02-04 21:38:49

标签: c# wpf mvvm

我正在尝试显示图片和名称。我创建的模型看起来像这样:

Class diagram

class Controller {
    public List<Car> Cars { get; set; }
}

class Car {
    public Media Media { get; set; }
    public string Name { get; set; }
}

class Media {
    public List<View> Views { get; set; }
}

class View {
    public Image Thumbnail { get; set; }
}

ViewModel:

class OverviewViewModel {
    Controller Controller { get; private set; }

    OverviewViewModel(Controller controller) {
        Controller = controller;
    }
}

所有类都实现了INotifyPropertyChange。 什么是显示Car.Name和汽车中每辆车的视图列表的第一个View.Thumbnail的最佳方式?

我查看了一个DataGrid,但无法弄清楚如何显示第一个缩略图。这可能也不是创建网格的正确方法,我还没有看过DataGrid的样式可能性。

首先,我在代码隐藏文件中创建了一个网格,并显示了有关加载的信息,但我希望能够从模型中更新图像,而无需了解模型的任何信息。

修改

显然我的绑定是正确的,我只需像这样设置DataGridTemplateColumn:

<DataGrid ItemsSource="{Binding Controller.Cars}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="{Binding Media.Views[0].Thumbnail}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

1 个答案:

答案 0 :(得分:0)

您正在使用ViewModel并传递直线模型。 ViewModel的任务是拥有一个特殊版本的模型,该版本特别适用于您要附加它的view

所以你可以创建一个IEnumerable<NameThumbViewModel>,它可以很容易地绑定到datagrid,itemscontrol等。 所以请记住,ViewModel可以是control,整个view甚至是row中的datagrid。 您还可以ViewModel包含ViewModelsViewModel列表。

因此,将model传递到您的viewmodel并来回处理映射,因为ViewModels的一个真正原因是有办法压缩视图相关数据以简单的消费方式。

希望这有帮助