伪无限网格

时间:2011-08-28 12:31:49

标签: wpf data-binding mvvm

我在这里遇到了一些设计问题。

我有一个观点:

<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上。 (每个单元只有一个视图模型,网格单元格是固定大小)

1)我希望Grid是伪无限的,即当添加和减去EditorVM时,Grid应该动态添加和删除Row \ Col定义,并且应该总是有足够的Grid,并且应该总是足够的填写父视图。

2)在我的包含viewmodel中,我导入了一个具有Grid属性的IGridEditor实现实例。如何将ItemsPanelTemplateGrid绑定到IEditor.Grid?

现在,我将CellVM添加到IGridEditor方法的集合中,然后当包含vm导入实例时,将包含vm的CellVM集合设置为instances集合,并且项目控件与使用Caliburn.Micro约定的项目控制绑定。

我正在使用Caliburn.Micro \ MEF btw。

任何人都可以帮我解决这个问题吗?

编辑:

一直试图理解这一点,但我是空的。

我唯一能找到的是

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

在我的视频模型中:

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

和类中相应的Export,它具有向Grid添加内容的方法/

1 个答案:

答案 0 :(得分:1)

  

1)我希望Grid是伪无限的,即当EditorVMs得到时   添加和减去,Grid应该动态添加和删除   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是最好的地方,但这是我能找到的最好的地方)