C# 如何在WPF画布上显示可观察的集合项
我有一个绑定到datagrid的可观察集合。 我可以将wpf控件(如label、textbox等)动态创建到datagrid单元格中,从而更新可观察的集合 现在,我想在画布上以行和列的形式显示这个项集合,就像在datagrid中一样。 请帮我拿那个。 我使用的代码如下C# 如何在WPF画布上显示可观察的集合项,c#,wpf,wpf-controls,observablecollection,C#,Wpf,Wpf Controls,Observablecollection,我有一个绑定到datagrid的可观察集合。 我可以将wpf控件(如label、textbox等)动态创建到datagrid单元格中,从而更新可观察的集合 现在,我想在画布上以行和列的形式显示这个项集合,就像在datagrid中一样。 请帮我拿那个。 我使用的代码如下 ObservableCollection<Data> Items= this.Items as ObservableCollection<Data>; if (this.Ite
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
}
}
}
}
}
Inputfield和UIelement属性是datagrid的两列,用于保存动态创建的控件信息。A
Visual
只能有一个父级,因此您必须将其从ObservableCollection
中删除(您的datagrid
可能绑定到该父级)首先……但随后您会将其放在画布上,而不是放在数据网格上
因此,如果您试图同时拥有UIElement
s集合的两个“视图”,那么您必须克隆这些元素,以便它们可以进入Canvas
什么是“数据”类型…你能详细说明一下吗
做事情的首选方法是将模型/视图模型保留在集合中(而不是UIElement
s),然后定义DataTemplate
s,它定义了这些数据类型的视觉效果。然后,您可以让DataGrid
和Canvas
都绑定到相同的数据集合,但在应用数据模板时,它们都有自己的膨胀视觉效果
请参阅以下链接:
AVisual
只能有一个父对象,因此您必须首先将其从observedcollection
(您的DataGrid
可能会绑定到中)中删除……但随后您会将其放在画布上,而不是放在DataGrid
上
因此,如果您试图同时拥有UIElement
s集合的两个“视图”,那么您必须克隆这些元素,以便它们可以进入Canvas
什么是“数据”类型…你能详细说明一下吗
做事情的首选方法是将模型/视图模型保留在集合中(而不是UIElement
s),然后定义DataTemplate
s,它定义了这些数据类型的视觉效果。然后,您可以让DataGrid
和Canvas
都绑定到相同的数据集合,但在应用数据模板时,它们都有自己的膨胀视觉效果
请参阅以下链接:
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));
}
}