wpf创建动态可点击“网格”

时间:2010-08-09 07:43:53

标签: c# wpf mvvm

我不确定如何解决我的问题。不寻找完整的代码只是帮助我应该去哪个方向。因为它的MVVM我不想要任何代码隐藏......如果可能的话......

从db我得到应该创建的“网格”的大小,例如2x3。 现在我希望在这个网格中放置一个“项目”,占据一个或多个点。

我目前正在尝试使用包含网格的ItemsControl(我想要一个网格,因为我想使用ShowGridLines =“True”) 但是如何创建动态网格呢?考虑使用uniformgrid但是没有ShowGridLines ...

第二个问题(因为我是一个mvvm noob)正在选择网格中的一个点。你点击的那个不会有问题。问题是,如果您要放置的项目占用两个位置。我怎么知道我点击的那个旁边的那个点?

感谢任何帮助

1 个答案:

答案 0 :(得分:2)

由于您无法轻松绑定 Grid 的行/列定义,我建议您构建一个简单的自定义控件,该控件直接从 Grid 继承。

这是我的方法,有3个额外的依赖属性:

  • int MyColumnCount
  • int MyRowCount
  • ObservableCollection MyChilds

当您从数据库中获取新值时,MyColumnCount / MyRowCount将绑定到您更新的ViewModel中的Properties。此外,ViewModel将提供FrameworkElements的集合,它将成为Grid中的项目并绑定到MyChilds。

您可以在ViewModel中创建新控件并使用Grid的附加属性来设置位置。例如:

TextBlock b = new TextBlock() { Text = "Hello World!" };
Grid.SetRow(b, <your position>);
Grid.SetColumn(b, <your position>);
Grid.SetColumnSpan(b, <your column span>);
MyChilds.Add(b);

在新 int 属性的 PropertyChangedCallbacks 中,根据新值修改行/列定义。 collection属性的回调在新的ObservableCollection上注册了一个集合更改事件,并在更改事件时将新项目添加到Grid的子项中。

这就是动态网格变化所需要的一切。

关于你的第二个问题: 这很容易。如果您发现,您将获得网格中单击项目的发件人。发件人主要是直接点击控件。您可以再次使用静态网格函数来计算位置:

Grid.GetRow(item);
Grid.GetColumn(item);
Grid.GetColumnSpan(item);

使用网格的总行数/列数(My ... Count),您可以计算邻居位置。