【发布时间】:2013-10-11 12:12:42
【问题描述】:
我是新手,所以请耐心等待。
我有一个视图模型和一个带有 ItemsControl 的视图,其中已经有一些数据,并且有自己的项目源。
但是我实际上想为控件中的项目编号,因为它们总是有 10 个。我可以通过在左侧添加大量文本块来做到这一点,但这很乏味,我正在尝试寻找不同的方法。
这就是我目前所掌握的要点:
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, Path=DataContext.Nums}" />
<TextBlock Grid.Column="1" Text="{Binding Item1}" />
<TextBlock Grid.Column="2" Text="{Binding Item2}" />
</Grid>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
我的问题是当然它只是为每个项目显示相同的项目,在这种情况下是“(集合)”,因为我有一个列表属性,其中包含 1-10。
在单独的 .cs 文件中绑定到 this:
private List<int> _nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
public List<int> Nums
{
get { return _nums; }
}
编辑:
所以我找到了一个解决方案,方法是在 itemssource 中创建一个新属性,它是一个字符串,然后对我的应用程序收集源数据的方式进行一些调整,我能够让它始终如一地工作。
如果这种方法可行,我仍然很感兴趣,但是在我看来,它的工作量会少很多。
【问题讨论】:
-
你能展示你正在绑定的类的结构吗?
-
实际的itemsource来自我的viewmodel中的一个属性,基本上我只是想使用第二个属性作为源?
-
TextBlock 不支持模板(以您引用它的方式)。根据您写的内容,直接的建议是用 MyUserControl 替换第一个 TextBlock。
-
我可以向您介绍
Enumerable.Range方法吗?非常方便:List<int> _nums = Enumerable.Range(1, 10).ToList();。显然,它对更大的范围更有用。 -
有趣,没有真正使用过 Linq,感谢您的提示!
标签: wpf xaml viewmodel itemtemplate