Wpf ItemsControl.ItemsPanelTemplate作为网格,并在不同列中添加新项

Wpf ItemsControl.ItemsPanelTemplate作为网格,并在不同列中添加新项,wpf,grid,dynamically-generated,itemspaneltemplate,Wpf,Grid,Dynamically Generated,Itemspaneltemplate,我正在使用Dynamicly创建的网格,在每个新列中包含一个添加到ItemsControl的新项 我在用瑞秋林的 现在,我有一个如下的主窗口 Xaml代码: 和Xaml.cs 公共部分类主窗口:窗口 { 私人帆布; 公共主窗口() { 初始化组件(); this.DataContext=newviewmodel(); } 已加载私有无效画布(对象发送方、路由目标) { ViewModel vm=this.DataContext作为ViewModel; canvas=发送者作为画布; 绑定b

我正在使用Dynamicly创建的网格,在每个新列中包含一个添加到ItemsControl的新项

我在用瑞秋林的

现在,我有一个如下的主窗口

Xaml代码:



和Xaml.cs

公共部分类主窗口:窗口
{
私人帆布;
公共主窗口()
{
初始化组件();
this.DataContext=newviewmodel();
}
已加载私有无效画布(对象发送方、路由目标)
{
ViewModel vm=this.DataContext作为ViewModel;
canvas=发送者作为画布;
绑定b=新绑定();
b、 来源=虚拟机;
b、 路径=新属性路径(ViewModel.ColumnCountProperty);
b、 Mode=BindingMode.OneWay;
canvas.SetBinding(Grid.ColumnProperty,b);
}
}
此主窗口的ViewModel作为DataContext:

公共类ViewModel:DependencyObject
{
专用中继命令添加;
公共视图模型()
{
}
公开收集法团
{
获取{return(observeCollection)GetValue(OcProperty);}
set{SetValue(OcProperty,value);}
}
//使用DependencyProperty作为Oc的后备存储。这将启用动画、样式、绑定等。。。
公共静态只读从属属性OcProperty=
DependencyProperty.Register(“Oc”、typeof(ObservableCollection)、typeof(ViewModel)、new-UIPropertyMetadata(new-ObservableCollection());
公共int列计数
{
获取{return(int)GetValue(ColumnCountProperty);}
set{SetValue(ColumnCountProperty,value);}
}
//使用DependencyProperty作为ColumnCount的后备存储。这将启用动画、样式、绑定等。。。
公共静态只读DependencyProperty ColumnCountProperty=
DependencyProperty.Register(“ColumnCount”、typeof(int)、typeof(ViewModel)、新UIPropertyMetadata(0));
公共中继命令添加
{
得到
{
if(this.add==null)
this.add=new RelayCommand(param=>this.AddString(),param=>this.CanAddString());
返回此文件。添加;
}
}
私有布尔卡纳德字符串()
{
返回true;
}
私有void AddString()
{
此.Oc.添加(“测试”+列计数);
ColumnCount++;
}
}

当我单击按钮时,命令运行正常,因此我有一个新的itemscontrol项,我的网格作为ItemsPanelTemplate正在使用新的ColumnDefinition更新,但该项不在正确的列中。

事实上,画布加载的东西是无用的

问题来自ColumnCountChanged中的GridHelpers类

我在SetStarColumns(grid)之后的ColumnCountChanged事件末尾添加了此项,以便在相应的单元格中添加项:

for(int i=0;i
成功了


编辑:我还使用了一个转换器(在上面的Xaml示例中称为“conv”)对ColumnCount ViewModel属性上的GridHelper.StarColumns属性进行单向绑定,以使所有新创建的列大小相等:

公共类StarsConverter:IValueConverter
{
公共对象转换(对象值、类型TargetType、对象参数、CultureInfo区域性)
{
int i=(int)值;
字符串s=“0”;
对于(int j=1;j
我知道这是一个迟到的答案:)
一个更优雅的解决方案是在Items ViewModel中添加两个依赖属性行和列

然后在ItemsControl中定义ItemContainerStyle:

<ItemsControl>
     <ItemsControl.ItemContainerStyle>
       <Style>                            
          <Setter Property="Grid.Row" Value="{Binding Path=Row}" />
          <Setter Property="Grid.Column" Value="{Binding Path=Column}" />
       </Style>                  
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

填充ItemsSource集合时,您已设置了行和列属性:

for (uint i = 0; i < yourCollection.Count; ++i )
{
    var item = yourCollection[i];
    item.Row = (int)(i / ColumnCount);
    item.Column = (int)(i % ColumnCount);
}
for(uint i=0;i