C# 如何在WPF画布上显示可观察的集合项

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

我有一个绑定到datagrid的可观察集合。 我可以将wpf控件(如label、textbox等)动态创建到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
                            }
                        }
                    }
} }


Inputfield和UIelement属性是datagrid的两列,用于保存动态创建的控件信息。

A
Visual
只能有一个父级,因此您必须将其从
ObservableCollection
中删除(您的
datagrid
可能绑定到该父级)首先……但随后您会将其放在
画布上,而不是放在
数据网格上

因此,如果您试图同时拥有
UIElement
s集合的两个“视图”,那么您必须克隆这些元素,以便它们可以进入
Canvas

什么是“数据”类型…你能详细说明一下吗

做事情的首选方法是将模型/视图模型保留在集合中(而不是
UIElement
s),然后定义
DataTemplate
s,它定义了这些数据类型的视觉效果。然后,您可以让
DataGrid
Canvas
都绑定到相同的数据集合,但在应用数据模板时,它们都有自己的膨胀视觉效果

请参阅以下链接:


A
Visual
只能有一个父对象,因此您必须首先将其从
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)); 
        } 
    }