带有Viewmodels的Xaml动态网格

带有Viewmodels的Xaml动态网格,xaml,viewmodel,Xaml,Viewmodel,您好,我正在尝试在xmal中创建一个通过ViewModel填充的网格。 网格为5x5网格,我的ViewModel包含“MyObject”列表。此对象包含两个int变量行和列,它们指示对象在网格中的位置。 MyObject也是一个视图模型,网格空间应该填充数据模板名称MyTemplate,其中MyObject作为DataContext。 现在我对xaml和视图模型还不太熟悉,但是最好的方法是什么呢?让我们看看…… 将一个可观察的集合放入VM,然后 选项1: …将简单网格添加到V中。从xaml.cs

您好,我正在尝试在xmal中创建一个通过ViewModel填充的网格。 网格为5x5网格,我的ViewModel包含“MyObject”列表。此对象包含两个int变量行和列,它们指示对象在网格中的位置。 MyObject也是一个视图模型,网格空间应该填充数据模板名称MyTemplate,其中MyObject作为DataContext。 现在我对xaml和视图模型还不太熟悉,但是最好的方法是什么呢?

让我们看看……
将一个可观察的集合放入VM,然后

选项1:
…将简单网格添加到V中。从xaml.cs订阅其CollectionChanged事件,将每个添加对象的ContentControl添加到网格,将ContentControl的Grid.Row和Grid.Column属性绑定到每个对象的属性,并将DataContext设置为对象本身,将ContentTemplate设置为Resources[“MyTemplate”]。(另外,对于任何已删除的对象,请查找相应的ContentControl并将其删除。)
赞成:简单
Con:.cs,不支持设计器

选项2:
…将ItemsControl设置为V。将其ItemPanelTemplate设置为网格,并将ObservableCollection绑定到其ItemsSource。然后将Itemtemplate设置为MyTemplate。现在,诀窍是根据您的值将项目放入正确的单元格中。为此,请使用ItemsControl的ItemContainerStyle属性,并将容器的Grid.Row和Column绑定到这些属性。
优点:漂亮的xaml,易于扩展
缺点:ItemContainerStyle在WPF中很棘手,在Silverlight中丢失了,所以在后者的情况下,您可以忘记它

选项3:
…您编写的自定义面板。也许从网格继承它。如果将元素放入其中,则检查其DataContext是否实现了包含属性的接口。然后将其用作选项2中的项目span…
赞成者:它应该工作得很好
反对者:你必须为此写一个新的面板


希望这3个选项中的一个适合您。

您可能是指xaml和xmal,对吧?谢谢,因为我使用的是silverlight,我想我会选择选项3。