2012-09-24 3 views
0

내부에 다른 UserControl_2가있는 UserControl (GridSearch)을 만들려고합니다. XAML을 사용하여 UserControl_2 패널에 FrameworkElements를 추가하고 싶습니다. DependencyProperty ObservableCollection 이벤트

그래서 나는 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가 필요합니다.

몇 시간에서 해결책을 찾고 있는데 해결 방법을 찾지 못했습니다.

답변

1

observable 컬렉션을 만들고 반환하기 위해 getObservableFilters() 메서드를 변경하십시오.

및 GridSearch() 생성자에서 InitializeComponent() 호출 후 Filters.CollectionChanged에 대한 처리기를 추가하고 비 정적 멤버 함수를 제공 할 수 있습니다.

+0

난 그냥 한 한 그 분 전 : <gsh:GridSearch.Filters>

이 내가 끝낼 코드입니다. "Public ObservableCollection Filters"속성은 GridSearch의 모든 객체 인스턴스에서 공유하며 이와 같이 사용할 수 없습니다. –

+1

Filters 속성은 그 자체로는 공유되지 않지만 동일한 컬렉션 인스턴스로 초기화합니다. - 새 FrameworkPropertyMetadata (getObservableFilters(), null) – Jogy

0

좋습니다. 마지막으로 핵심 작업은 컨트롤의 각 인스턴스에 대해 생성자에서 새로운 ObservableCollection()을 만드는 것입니다.

그러나 아직 한 가지 문제가 있습니다. 모든 것은 런타임에 작동하지만 오류가 발생하면 디자이너는 아무 것도 표시 할 수 없습니다.

개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

는이이 라인 tabout입니다 :

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> 
관련 문제