使用 MVVM 绑定嵌套列表

Binding nested list using 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; }
}

视图模型:

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

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

所有 类 实现 INotifyPropertyChange。 显示 Cars 中每辆汽车的视图列表的 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>

您使用的是 ViewModel 并且传递的是直线模型。 ViewModel 的任务是拥有一个特殊版本的模型,该模型是专门为您要附加的 view 制作的。

因此您可以创建一个 IEnumerable<NameThumbViewModel> 可以轻松绑定到数据网格、项目控件等。 所以请记住,ViewModel 可以代表 control、整个 view,甚至可以代表 datagrid 中的 row。 您还可以让 ViewModel 包含 ViewModelsViewModel 的列表。

因此,将 model 传递到您的 viewmodel 并处理来回映射,因为 ViewModels 的真正原因之一是有一种方法可以压平视图以易于使用的方式提供相关数据。

希望对您有所帮助