我定义了一个类型 董事会 其中包含公共(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/