我已经定义了一个类型 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 属性中定义。 我怎样才能做到这一点? 提前致谢!
答案 0 :(得分:1)
我的理解是BoardColumnView
一个自己的UserControl?
如果是这样,只需在代码后面设置此UserControl的DataContext并使用this.DataContext = new BoardColumnViewModel();
或使用等效的XAML。然后在您的BoardViewModel
和ObserveableCollection<>
中创建,其中包含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
,这是你的模型。