在wpf网格中放置不同类型的用户控件

时间:2013-09-03 09:08:28

标签: c# wpf xaml data-binding grid

我从WPF开始,我想创建一个根据上下文显示形状的网格。因此,例如在一个单元格中,我可以有一个圆形或一个矩形!

我创建了自定义圈“Circle.Xaml”和我的自定义矩形“Rectangle.Xaml”。我还创建了他们的View-Models“CircleVM.Cs”和“RectangleVM.Cs”。

现在,我在我的应用程序中添加了一个listBox,让用户在我的网格单元格中放置圆形或矩形。

我的问题是:

  1. 我如何将所有这些与我的细胞结合在一起?为了在我将简单地将相应的View-Model添加到绑定到我的网格的集合中时进行正确的控制!!
  2. 当view-Model构造函数具有在初始化时未定义的参数时,如何设置视图的DataContext(参数值也根据上下文而定)!!

1 个答案:

答案 0 :(得分:1)

当您在DataTemplate部分中声明Resources时,您可以选择...您可以为其提供一个名称,然后使用该名称来引用它,或者您将其保留为名称。如果DataTemplate没有名称(或x:Key值),则它将自动应用于其中指定类型的所有对象,除非它们具有另一个DataTemplate表达式集,其名称为{{ 1}}。

因此,您可以将以下内容添加到您的应用DataTemplate部分(Resources)中,它将适用于您应用中的所有视图模型:

App.xaml

请注意,您需要添加所需的XML命名空间......如下所示:

<DataTemplate DataType="{x:Type ViewModels:CircleVM}">
    <Views:Circle />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:RectangleVM}">
    <Views:Rectangle />
</DataTemplate>

现在,每当您将xmlns:ViewModels="clr-namespace:YourApplicationName.FolderNameIfApplicable" xmlns:Views="clr-namespace:YourApplicationName.FolderNameIfApplicable" 类的实例添加到用户界面时,都会显示相关的CircleVM文件:

Circle.xaml

要在两个视图模型之间切换,请按上述方法创建一个属性...再次,您有两个选择:

<ContentControl Content="{Binding YourViewModelProperty}" />

或者更好的是,创建一个实现public object YourViewModelProperty // with valid getter/setter removed here 接口的BaseViewModel类,并从中扩展所有视图模型:

INotifyPropertyChanged

用户更改其选择时的最后一步是设置此属性的值:

public BaseViewModel YourViewModelProperty // with valid getter/setter removed here