0

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

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

4

2 回答 2

1

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

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

于 2012-09-24T11:26:10.380 回答
0

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

但是,仍然存在一个问题。一切都在运行时工作,但设计师无法显示任何东西,因为它得到以下错误:

你调用的对象是空的。

这是这一行的标签:<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>
于 2012-09-24T13:47:12.937 回答