我有一个可观察的集合,绑定到datagrid。 我可以动态地创建标签,文本框等wpf控件到datagrid单元格中,从而更新可观察的集合。
现在,我想像在datagrid中一样在行和列中显示这个项目集合。 请帮我搞定。 我使用的代码如下。
ObservableCollection<Data> Items= this.Items as ObservableCollection<Data>;
if (this.Items != null)
{
foreach (var element in this.Items)
{
if (element != null)
{
UIElement getitem = (UIElement)element.InputField;
//where inputfield is a property which holds the control.
// It eturns the control that has created.
canvas.Children.Add(getitem);//adding the control to canvas
}
}
}
但它抛出异常(将控件添加到画布)如下所示。 指定的Visual已经是另一个Visual的子项或CompositionTarget的根。
感谢您的回复。
其中数据是如下定义的类。
公共类数据:INotifyPropertyChanged {
private UIElement _uIElement;
public UIElement UIElement
{
get { return _uIElement; }
set
{
if (value != _uIElement)
{
_uIElement = value;
this.OnPropertyChanged("UIElement");
}
}
}
private UIElement _inputField;
public UIElement InputField
{
get { return _inputField; }
set
{
if (value != _inputField)
{
_inputField = value;
this.OnPropertyChanged("InputField");
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
} }
Inputfield和UIelement属性是datagrid的2列,用于保存动态创建的控件信息。
答案 0 :(得分:3)
Visual
只能拥有一个父级,因此您必须首先将ObservableCollection
(可能是您的DataGrid
绑定)从...中移除....但是你会将它放在Canvas
上但不放在DataGrid
上。
所以,如果您正试图获得2&#34;观看&#34;您同时收集了UIElement
个,然后您必须克隆这些元素,以便他们可以进入Canvas
。
什么是&#34;数据&#34;类型...你能详细说明吗?
执行操作的首选方法是将模型/视图模型保留在集合中(而不是UIElement
s),然后定义DataTemplate
来定义这些数据类型的视觉效果。然后你可以让DataGrid
和Canvas
都绑定到同一个数据集合,但是当应用DataTemplates时,它们每个都会有自己的膨胀视觉效果。
请参阅以下链接: