【问题标题】:DependencyProperty ObservableCollection eventDependencyProperty ObservableCollection 事件
【发布时间】:2012-09-24 10:27:59
【问题描述】:

我正在尝试制作内部有另一个 UserControl_2 的 UserControl (GridSearch)。我想使用 XAML 将一些 FrameworkElements 添加到 UserControl_2 面板。

所以我在 GridSearch 中做了 ObservableCollection DependencyProperty:

public partial class GridSearch : UserControl
{
    public GridSearch()
    {
        InitializeComponent();
    }

    public ObservableCollection<Filter> Filters
    {
        get { return (ObservableCollection<Filter>)GetValue(FiltersProperty); }
        set { SetValue(FiltersProperty, value); }
    }

    public static readonly DependencyProperty FiltersProperty =
        DependencyProperty.Register("Filters",
                                    typeof(ObservableCollection<Filter>), 
                                    typeof(GridSearch),
                                    new FrameworkPropertyMetadata(getObservableFilters(), null)
                                    );

    private static ObservableCollection<Filter> getObservableFilters()
    {
        var ob = new ObservableCollection<Filter>();
        ob.CollectionChanged += ob_CollectionChanged;
        return ob;
    }

    private static void ob_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {

    }
}

现在我尝试使用 ob_CollectionChanged 向面板添加新元素。但是,因为它是静态方法,所以我无法访问面板。我无法投射发件人,因为它只给了我 ObservableCollection。但是我需要GridSearch。

我正在寻找几个小时的解决方案,但我不知道如何解决它。

【问题讨论】:

    标签: wpf events dependency-properties observablecollection


    【解决方案1】:

    将 getObservableFilters() 方法更改为只创建并返回可观察集合。

    并且在 GridSearch() 构造函数中,在调用 InitializeComponent() 之后,可以为 Filters.CollectionChanged 添加一个处理程序,并提供一个非静态成员函数。

    【讨论】:

    • 我刚刚在几分钟前完成了它。看起来“public ObservableCollection Filters”属性由 GridSearch 的所有对象实例共享,不能这样。
    • Filters 属性不是自己共享的,但是您使用相同的集合实例对其进行初始化 - new FrameworkPropertyMetadata(getObservableFilters(), null)
    【解决方案2】:

    好的,它最终起作用了,关键是在构造函数中为控件的每个实例创建新的 ObservableCollection()。

    但是还有一个问题。一切都在运行时工作,但设计器无法显示任何内容,因为它出现以下错误:

    对象引用未设置为对象的实例。

    这是这一行的标签:&lt;gsh:GridSearch.Filters&gt;

    这是我最终得到的代码:

    public partial class GridSearch : UserControl
    {
        public GridSearch()
        {
            Filters = new ObservableCollection<Label>();
            InitializeComponent();
    
    
            Filters.CollectionChanged += Filters_CollectionChanged;
        }
    
    
        void Filters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            foreach (Label uc in e.NewItems)
                pnlFilters.Children.Add(uc);                
        }
    
        public ObservableCollection<Label> Filters
        {
            get { return (ObservableCollection<Label>)GetValue(FiltersProperty); }
            set { SetValue(FiltersProperty, value); }
        }
    
        public static readonly DependencyProperty FiltersProperty =
            DependencyProperty.Register("Filters",
                                        typeof(ObservableCollection<Label>), 
                                        typeof(GridSearch),
                                        new FrameworkPropertyMetadata(new ObservableCollection<Label>(), null)
                                        );
    
    
    
    }
    

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.5*"/>
            <RowDefinition Height="0.5*"/>
        </Grid.RowDefinitions>
    
        <gsh:GridSearch>
            <gsh:GridSearch.Filters>
                <Label Content="aa" />
                <Label Content="aa" />
                <Label Content="aa" />
            </gsh:GridSearch.Filters>
        </gsh:GridSearch>
    
        <gsh:GridSearch Grid.Row="1">
            <gsh:GridSearch.Filters>
                <Label Content="bb" />
                <Label Content="cc" />
                <Label Content="dd" />
            </gsh:GridSearch.Filters>
        </gsh:GridSearch>
    </Grid>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2014-05-03
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多