为ItemsControl的每个项创建一个ViewModel

时间:2015-07-20 21:29:10

标签: c# wpf mvvm


我已经定义了一个类型 Board ,它包含一个公共属性

ObservableCollection<Column> Columns

我想使用MVVM模式显示它。 我创建了 BoardView 并将其绑定到 BoardViewModel 。 BoardViewModel公开Board类型的公共财产 Board 。 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 ,它将在 Column 属性中定义。 我怎样才能做到这一点? 提前致谢!

2 个答案:

答案 0 :(得分:1)

我的理解是BoardColumnView一个自己的UserControl?

如果是这样,只需在代码后面设置此UserControl的DataContext并使用this.DataContext = new BoardColumnViewModel();或使用等效的XAML。然后在您的BoardViewModelObserveableCollection<>中创建,其中包含BoardColumnView的多个实例,并将ItemSource设置为此集合。在BoardColumnView XAML中定义BoardView中显示的布局,绑定等。

因此,每次向绑定到集合的ItemsSource添加BoardColumnView时,都会创建一个新的BoardColumnViewModel实例。

......这是我对你的问题的理解,但我可能完全错了:)。

答案 1 :(得分:1)

您可以在Columns中定义一个BoardViewModel属性,其中包含BoardColumnViewModel的集合。像这样:

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

您需要在BoardViewModel中的某处初始化此属性,例如:

public BoardViewModel(...)
{
     ...
     Columns = new ObservableCollection<BoardColumnViewModel>(Board.Columns.Select(c => new BoardColumnViewModel(c)));
}

然后绑定到该属性,而不是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的一般原则是不建议直接绑定到模型。相反,您应该始终尝试绑定到视图模型。这就是为什么你遇到了你所描述的问题 - 因为你绑定了一个公共财产Board,这是你的模型。