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

时间:2012-07-26 14:18:32

标签: c# wpf wpf-controls observablecollection

我有一个可观察的集合,绑定到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列,用于保存动态创建的控件信息。

1 个答案:

答案 0 :(得分:3)

Visual只能拥有一个父级,因此您必须首先将ObservableCollection(可能是您的DataGrid绑定)从...中移除....但是你会将它放在Canvas上但不放在DataGrid上。

所以,如果您正试图获得2&#34;观看&#34;您同时收集了UIElement个,然后您必须克隆这些元素,以便他们可以进入Canvas

什么是&#34;数据&#34;类型...你能详细说明吗?

执行操作的首选方法是将模型/视图模型保留在集合中(而不是UIElement s),然后定义DataTemplate来定义这些数据类型的视觉效果。然后你可以让DataGridCanvas都绑定到同一个数据集合,但是当应用DataTemplates时,它们每个都会有自己的膨胀视觉效果。

请参阅以下链接: