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() を作成することが重要でした。

ただし、まだ 1 つの問題があります。すべてが実行時に機能しますが、次のエラーが発生するため、デザイナーは何も表示できません。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

そして、これはこの行のタブアウトです:<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 に答える