绑定转换器使用列表中的项目索引

时间:2011-12-06 15:06:28

标签: c# wpf xaml data-binding itemscontrol

我有一个场景需要我将对象列表绑定到网格。我希望这样的行为: -

•当项目添加到列表中时,它将移动到网格中的下一个可用空间。 (像一个包装板)

以下显示的是我目前的XAML。

<ItemsControl ItemsSource="{Binding Path=Contents}" Grid.Row="1">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <cc:DynamicGrid ShowGridLines="True" RowCount="{Binding Path= SelectedGridStyle.RowCount}" ColCount="{Binding Path=SelectedGridStyle.ColCount}"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel> 
</ItemsControl>

目前,这会将所有项目放在彼此之上,因为我没有指定行索引或列索引。我打算添加以下内容来纠正这个

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

我有以下代码,它允许我从列表中的索引计算rowIndex和columnIndex。

int m_ColumnCount = 3;
int rowIndex = index / m_ColumnCount;
int columnIndex = index - (rowIndex * m_ColumnCount);

我正在尝试使用上面的方法创建一个绑定转换器来设置这些值。但是,此计算取决于视图模型中保留的列数和行数的值。有没有办法获得这些价值?可以实现上述目标还是有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

如果绑定需要多个值,则可以使用MultiBinding。要绑定到主视图模型,您可以使用RelativeSource定位ItemsControl

答案 1 :(得分:1)

查看此内容 - http://www.switchonthecode.com/tutorials/wpf-tutorial-using-multibindings

你会看到大约使用多重绑定的一半,这很简单。然后他们会告诉你如何为它创建一个转换器。听起来你熟悉转换器,所以我认为这篇文章会让你感动。