2012-09-24 51 views
0

我想让UserControl(GridSearch)里面有另一个UserControl_2。我想使用XAML将一些FrameworkElement添加到UserControl_2的面板。DependencyProperty ObservableCollection事件

所以我做的ObservableCollection的DependencyProperty在GridSearch:

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。

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

回答

1

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

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

+0

我刚才已经做了分钟前。它看起来像“Public ObservableCollection Filters”属性由GridSearch的所有对象实例共享,它不能像这样。 –

+1

Filters属性本身不是共享的,但是您使用相同的集合实例初始化它 - 新的FrameworkPropertyMetadata(getObservableFilters(),null) – Jogy

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> 
相关问题