我在这里遇到了一些设计问题。
我有一个观点:
<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添加内容的方法/
答案 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
是最好的地方,但这是我能找到的最好的地方)