c# - 为 ItemsControl 的每一项创建一个 ViewModel

标签 c# wpf mvvm

我定义了一个类型 董事会 其中包含公共(public)属性(property)

ObservableCollection<Column> Columns

我想使用 MVVM 模式来显示它。
我创建了 看板并将其绑定(bind)到 BoardViewModel . BoardViewModel 公开公共(public)属性 董事会 板型。
BoardView 包含一个控件 ItemsControl,它设置 ItemsSource={Binding Board.Columns}。
<ItemsControl ItemsSource="{Binding Board.Columns}">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Border BorderThickness="2" Margin="10" BorderBrush="#9f9f9f" Width="250">
            <v:BoardColumnView Background="#e3e3e3" />
        </Border>
    </DataTemplate>
</ItemsControl.ItemTemplate>

BoardColumnView 应该显示 的属性专栏 类型,这很好用。
我的问题是我想为 BoardColumn 创建一个 ViewModel,而不是只显示 Column 类型的属性,我想显示 BoardColumnViewModel 这将在 中定义专栏 属性(property)。
我怎样才能做到这一点?
提前致谢!

最佳答案

你可以简单地定义一个 Columns您的 BoardViewModel 中的属性(property)将包含 BoardColumnViewModel 的集合.像这样的东西:

public ObservableCollection<BoardColumnViewModel> Columns { get; private set; }

您需要在 BoardViewModel 中的某处初始化此属性。 , 例如:
public BoardViewModel(...)
{
     ...
     Columns = new ObservableCollection<BoardColumnViewModel>(Board.Columns.Select(c => new BoardColumnViewModel(c)));
}

然后绑定(bind)到该属性,而不是 Board.Columns :
<ItemsControl ItemsSource="{Binding Columns}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="2" Margin="10" BorderBrush="#9f9f9f" Width="250">
                <v:BoardColumnView Background="#e3e3e3" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

作为 MVVM 的一般原则,不建议直接绑定(bind)到模型。相反,您应该始终尝试绑定(bind)到 View 模型。这就是您遇到所描述问题的原因 - 因为您绑定(bind)到公共(public)属性 Board ,这是你的模型。

关于c# - 为 ItemsControl 的每一项创建一个 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31526675/

相关文章:

c# - ContentControl.ContentTemplateSelector 动态选择模板

c# - C# 开发者的编程问题书 - 算法

c# - 如何从 Click 事件调用 Paint 方法?

c# - 使用泛型的 WPF View/ViewModels - 如何?

c# - WPF DataGrid CellEditEnded 事件

wpf - 更改托管到 Winform 的依赖项属性(在 ViewModel 中)

wpf - MVVM 中 WPF 命令的可接受模式是什么?

c# - 在 C# 中捕获游戏屏幕截图的最快方法?(每秒超过 20 张图像)

c# - 内存使用,SortedList vs List 问题

wpf - 如何更改 ContentPresenter 上的 FontFamily?