0

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

我创建了自定义圆圈“Circle.Xaml”和自定义矩形“Rectangle.Xaml”。我还创建了他们的视图模型“CircleVM.Cs”和“RectangleVM.Cs”。

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

我的问题是:

  1. 我怎样才能将所有这些与我的细胞绑定?为了放置正确的控件,我将在绑定到我的网格的集合中简单地添加他相应的 View-Model !
  2. 当视图模型构造函数具有未在初始化时定义的参数时,如何设置视图的 DataContext (参数的值也根据上下文)!
4

1 回答 1

1

当你DataTemplate在一个Resources部分中声明 a 时,你有一个选择……你可以给它一个名字,然后用这个名字来引用它,或者你不给它一个名字。如果 aDataTemplate没有名称(或x:Key值),那么它将自动应用于其中指定类型的所有对象,除非它们有另一个DataTemplate明确设置为 named 的对象DataTemplate

因此,您可以将以下内容添加到您的应用程序Resources部分(在 中App.xaml),它将应用于您应用程序中的所有视图模型:

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

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

xmlns:ViewModels="clr-namespace:YourApplicationName.FolderNameIfApplicable"
xmlns:Views="clr-namespace:YourApplicationName.FolderNameIfApplicable"

现在,每当您将CircleVM类的实例添加到 UI 中时,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

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

if (userHasChosenCircle) YourViewModelProperty = new CircleVM();
else YourViewModelProperty = new RectangleVM();
于 2013-09-03T09:18:42.007 回答