2012-09-24 80 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> 
相關問題