Псевдо-бесконечная сетка - PullRequest
       0

Псевдо-бесконечная сетка

1 голос
/ 28 августа 2011

У меня тут небольшая проблема с дизайном.

У меня есть вид:

<ItemsControl x:Name="CellVMs">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
            <Grid />
         </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
      <Style>
        <Setter Property="Grid.Row"
                Value="{Binding Position.Y}" />
        <Setter Property="Grid.Column"
                Value="{Binding Position.X}" />
      </Style>
    </ItemsControl.ItemContainerStyle>
  </ItemsControl>

, который связан с коллекцией моделей представления, у которых есть свойство position, которое стиль использует для позиционирования его на ItemPanelTemplate. (Только одна view-модель на ячейку, и ячейки сетки имеют фиксированный размер)

1) Я бы хотел, чтобы эта сетка была псевдо-бесконечной, то есть по мере добавления и вычитания EditorVM сетка должна динамически добавлять и удалять определения строк / столбцов, и всегда должно быть достаточно сетки, и всегда должно быть достаточно заполнить родительский вид.

2) В моей содержащей модели представления я импортирую экземпляр реализации IGridEditor, который имеет свойство Grid. Как я могу привязать ItemsPanelTemplateGrid к IEditor.Grid?

Прямо сейчас я добавляю CellVM в коллекцию в методах IGridEditor, затем, когда содержащий vm импортирует экземпляр, устанавливает коллекцию CellVM содержащего vm в коллекцию экземпляров, а элемент управления привязывается к ней с использованием соглашений Caliburn.Micro. .

Я использую Caliburn.Micro \ MEF, кстати.

Может кто-нибудь помочь мне разобраться?

Edit:

Я пытался понять это, но я иду пустым.

Единственное, что я могу найти, это

<ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
            <Grid x:Name="EditorGrid"/>
         </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

и в моем viemodel:

[Import("EditorGrid", typeof(Grid))]
public Grid EditorGrid { get; set; }

и соответствующий объект Export в классе, который имеет методы для добавления объектов в сетку /

1 Ответ

1 голос
/ 31 августа 2011

1) Я бы хотел, чтобы эта сетка была псевдо-бесконечной, т.е. добавлено и вычтено, Сетка должна динамически добавлять и удалять Row \ Col Определения, и всегда должно быть достаточно Grid, и там должно всегда быть достаточно, чтобы заполнить родительское представление.

Вы можете создать пользовательский Grid, который автоматически добавляет строки или столбцы при необходимости:

public class AutoExpandGrid : Grid
{
    protected override System.Windows.Media.Visual GetVisualChild(int index)
    {
        var visualChild = base.GetVisualChild(index);

        var uiElement = visualChild as UIElement;
        if (uiElement != null)
            EnsureEnoughRowsAndColumns(uiElement);

        return visualChild;
    }

    private void EnsureEnoughRowsAndColumns(UIElement child)
    {
        int minRows = GetRow(child) + GetRowSpan(child);
        int minColumns = GetColumn(child) + GetColumnSpan(child);

        while (minRows > RowDefinitions.Count)
        {
            RowDefinitions.Add(new RowDefinition());
        }

        while (minColumns > ColumnDefinitions.Count)
        {
            ColumnDefinitions.Add(new ColumnDefinition());
        }
    }
}

(не уверен, GetVisualChild - лучшее место для этого, но это лучшее, что я смог найти)

...