0

データグリッドにバインドされた監視可能なコレクションがあります。ラベル、テキストボックスなどの wpf コントロールを 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 のルートです。

ご回答ありがとうございます。

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は親を 1 つしか持つことができないため、最初にObservableCollection(おそらくあなたDataGridがバインドされている)からそれを削除する必要がCanvasありますDataGrid

UIElementしたがって、 のコレクションの 2 つの「ビュー」を同時に取得しようとしている場合は、要素を複製して、 に移動できるようにする必要がありCanvasます。

「データ」タイプとは何ですか...詳しく説明していただけますか?

推奨される方法は、モデル/ビュー モデルをコレクション ( ではなくUIElement) に保持DataTemplateし、それらのデータ型のビジュアルを定義する を定義することです。次に、DataGridと のCanvas両方を同じデータ コレクションにバインドできますが、DataTemplates が適用されると、それぞれが独自の膨張した Visuals を持つことになります。

次のリンクを参照してください。

于 2012-07-26T14:26:47.510 に答える