Сделал UserControl там зависимое свойство-коллекция. На форме разместил несколько таких контролов с разными параметрами. Но почему-то каждый из этих контролов видит это свойство не как набор всех элементов заданных внутри него, а как конкатенацию коллекций, заданных для всех контролов, размещенных на форме.
XAML :
Код :
<my1:CommonCtrlKirishi Rows="22" Floors="12">
                <my1:CommonCtrlKirishi.PointsEmptyLeft>
                    <my1:GridPoint X="0" Y="0" />
                    <my1:GridPoint X="0" Y="1" />
                    ...
                    <my1:GridPoint X="0" Y="10" />                    
                </my1:CommonCtrlKirishi.PointsEmptyLeft>
 
 
            </my1:CommonCtrlKirishi>
        </TabItem>
        <TabItem Header="Штабелер 2">
 
            <my1:CommonCtrlKirishi StackerID="2" Rows="22" Floors="12">
 
                <my1:CommonCtrlKirishi.PointsEmptyLeft>
                    <my1:GridPoint X="0" Y="0" />
                    <my1:GridPoint X="0" Y="1" />
                    ...
                    <my1:GridPoint X="0" Y="9" />
                    <my1:GridPoint X="0" Y="10" />
                    <my1:GridPoint X="0" Y="11" />
                </my1:CommonCtrlKirishi.PointsEmptyLeft>
                <my1:CommonCtrlKirishi.PointsEmptyRight>                   
                    <my1:GridPoint X="0" Y="1" />
                    <my1:GridPoint X="0" Y="2" />
                    ...
                    <my1:GridPoint X="0" Y="10" />
                    <my1:GridPoint X="0" Y="11" />
                </my1:CommonCtrlKirishi.PointsEmptyRight>
            </my1:CommonCtrlKirishi>

Код свойства контрола:
C# Code:
  1. // Dependency Property
  2.         public static readonly DependencyProperty PointsEmptyLeftDP = DependencyProperty.Register("PointsEmptyLeft", [Ссылки могут видеть только зарегистрированные пользователи. ](ObservableCollection<GridPoint>), [Ссылки могут видеть только зарегистрированные пользователи. ](StackerControl), [Ссылки могут видеть только зарегистрированные пользователи. ] FrameworkPropertyMetadata([Ссылки могут видеть только зарегистрированные пользователи. ] ObservableCollection<GridPoint>(),DepParamsChanged));
  3.         // .NET Property wrapper
  4.         [Description("Free points in left rack"), Category("Stacker")]
  5.         public ObservableCollection<GridPoint> PointsEmptyLeft
  6.         {
  7.             get
  8.             {
  9.                 return (ObservableCollection<GridPoint>)GetValue(PointsEmptyLeftDP);
  10.             }
  11.             set
  12.             {
  13.                 SetValue(PointsEmptyLeftDP, value);
  14.  
  15.             }
  16.         }
  17.  
  18.         // Dependency Property
  19.         public static readonly DependencyProperty PointsEmptyRightDP = DependencyProperty.Register("PointsEmptyRight", [Ссылки могут видеть только зарегистрированные пользователи. ](ItemsChangeObservableCollection<GridPoint>), [Ссылки могут видеть только зарегистрированные пользователи. ](StackerControl), [Ссылки могут видеть только зарегистрированные пользователи. ] FrameworkPropertyMetadata([Ссылки могут видеть только зарегистрированные пользователи. ] ItemsChangeObservableCollection<GridPoint>(), DepParamsChanged));
  20.         // .NET Property wrapper
  21.         [Description("Free points in right rack"), Category("Stacker")]
  22.         public ItemsChangeObservableCollection<GridPoint> PointsEmptyRight
  23.         {
  24.             get
  25.             {
  26.                 return (ItemsChangeObservableCollection<GridPoint>)GetValue(PointsEmptyRightDP);
  27.             }
  28.             set
  29.             {
  30.                 SetValue(PointsEmptyRightDP, value);
  31.  
  32.             }
  33.         }
  34.  
  35. public void SetParam(String propname, Object val, object oldval)
  36.         {
  37.             switch (propname)
  38.             {
  39.                ...
  40.                 case "PointsEmptyLeft":
  41.                     restruct_left();
  42.                     set_cell_styles();
  43.                     break;
  44.                 case "PointsEmptyRight":
  45.                     restruct_right();
  46.                     set_cell_styles();
  47.                     break;
  48.             }
  49.         }
  50.  
  51.         private static void DepParamsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  52.         {
  53.             StackerControl ctrl = (StackerControl)d;
  54.             
  55.             ctrl.SetParam(e.Property.Name, e.NewValue, e.OldValue);
  56.             
  57.         }