0

StackPanel から派生したカスタム StackPanel を作成したいと考えています。しかし、項目を追加するには、特別なリストを作成したいと思います (List<> または ObservableCollection<> を使用できます)。それはこのようなものでなければなりません、

<mc:MyStackPanel>
  <mc:MyStackPanel.Items>
    <mc:MyControl Content="A" />
    <mc:MyControl Content="B" />
    <mc:MyControl Content="C" />
  </mc:MyStackPanel.Items>
</mc:MyStackPanel>

このようではありません(現在これが機能しています)、

<mc:MyStackPanel>
   <mc:MyControl Content="A" />
   <mc:MyControl Content="B" />
   <mc:MyControl Content="C" />
</mc:MyStackPanel>

ObservableCollection を使用してみましたが、アイテムを追加すると完全に機能します。インテリセンスも、追加できる MyControl を 1 つだけ表示していました。

ここで、コレクションからリストを取得して StackPanel に追加する方法、つまり stkPanel.Children.Add() を使用する方法を説明します。

代わりにパネルを使用する必要がありますか、またはリストを取得してパネルに追加する方法は? 前もって感謝します。

PS: いくつかのオプションを試しましたが、ItemsControl の使用を含め、リストは常に null です。したがって、おそらくここでいくつかの点が欠けています。パネルに追加できるコントロール タイプが 1 つだけ必要なため、ここでも ItemsControl を使用するのは私のシナリオには合いません。

4

1 に答える 1

0

のコレクション変更イベントを使用して、プロパティの同期ObservableCollectionを維持するのはどうですか?ChildrenXAMLのコレクションにアイテムを明示的に追加する必要がないように、属性も含めましたContentProperty。必要に応じて、これを削除できます。

[ContentProperty("CustomItems")]
public class MyCustomStackPanel : StackPanel
{
    public MyCustomStackPanel()
    {
        CustomItems = new ObservableCollection<MyUserControl>();
    }

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (object element in e.NewItems)
            {
                Children.Add((UIElement) element);
            }
        }

        if (e.OldItems != null)
        {
            foreach (object element in e.OldItems)
            {
                Children.Remove((UIElement)element);
            }
        }
    }

    private ObservableCollection<MyUserControl> _customItems;
    public ObservableCollection<MyUserControl> CustomItems
    {
        get { return _customItems; }
        set
        {
            if(_customItems == value)
                return;

            if (_customItems != null)
                _customItems.CollectionChanged -= OnCollectionChanged;

            _customItems = value;

            if (_customItems != null)
                _customItems.CollectionChanged += OnCollectionChanged;
        }
    }
}

XAMLは次のようになります(ローカル名前空間はカスタムコントロールが含まれるプロジェクトを指します)

<local:MyCustomStackPanel>
    <local:MyUserControl></local:MyUserControl>
</local:MyCustomStackPanel>
于 2013-02-17T13:27:00.707 に答える