DependencyProperty ObservableCollection事件

时间:2012-09-24 10:27:59

标签: wpf events dependency-properties observablecollection

我正在尝试制作另一个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。

我正在寻找几个小时的解决方案,我无法找到任何解决方法。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好的,最后关键是在构造函数中为每个控件实例创建新的ObservableCollection()。

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

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

这是tabout这一行:<gsh:GridSearch.Filters>

这是我最终得到的代码:

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>