0

我有一个绑定到数据网格的可观察集合。我可以动态地将标签、文本框等 wpf 控件创建到数据网格单元中,从而更新可观察的集合。

现在,我想在画布上以行和列的形式显示这些项目集合,就像在数据网格中一样。请帮我搞定。我正在使用如下代码。

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 的根。

谢谢您的答复。

其中 Data 是一个定义如下的类。

公共类数据: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 属性是数据网格的 2 列,其中包含动态创建的控件信息。

4

1 回答 1

3

AVisual只能有一个父级,因此您必须首先将其从ObservableCollection(可能是您DataGrid的绑定到的)中删除....但是然后您将其放在您的Canvas而不是您的DataGrid.

因此,如果您尝试同时拥有UIElements 集合的 2 个“视图”,那么您必须克隆元素,以便它们可以进入Canvas.

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

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

请参阅以下链接:

于 2012-07-26T14:26:47.510 回答