【问题标题】:How to show observable collection items on WPF canvas如何在 WPF 画布上显示可观察的集合项
【发布时间】:2012-07-26 14:18:32
【问题描述】:

我有一个绑定到数据网格的可观察集合。 我可以动态地将标签、文本框等 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 列,其中包含动态创建的控件信息。

【问题讨论】:

    标签: c# wpf wpf-controls observablecollection


    【解决方案1】:

    Visual 只能有一个父级,因此您必须首先将其从 ObservableCollection (大概是您的 DataGrid 绑定到)中删除....但是您可以将其放在您的 @987654327 @ 但不在你的 DataGrid 上。

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

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

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

    查看这些链接:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2010-11-18
      • 2017-03-12
      相关资源
      最近更新 更多