【问题标题】:Binding to Viewmodel Collection inside ItemTemplate绑定到 ItemTemplate 中的 Viewmodel 集合
【发布时间】: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&lt;int&gt; _nums = Enumerable.Range(1, 10).ToList();。显然,它对更大的范围更有用。
  • 有趣,没有真正使用过 Linq,感谢您的提示!

标签: wpf xaml viewmodel itemtemplate


【解决方案1】:

到目前为止,在我看来,最简单的做法是简单地将 int 属性添加到您的数据类型或数据视图模型类中,然后将 Bind 直接添加到您的 ItemTemplate 中:

<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{Binding Number}" />
            <TextBlock Grid.Column="1" Text="{Binding Item1}" />
            <TextBlock Grid.Column="2" Text="{Binding Item2}" />
        </Grid>
    </StackPanel>
</DataTemplate>

在 WPF 中,我们通常会尝试为每个视图创建一个视图模型类,其中包含我们需要在其中显示的所有数据。

更新 >>>

忽略数据可能附带或不附带的数字...只需添加一个int Number 属性并在使用数据填充其他属性时将其设置为0。当您将数据传递给视图模型时,只需对其进行迭代,并对其进行正确编号。假设您的收藏名为 Items,您可以这样做:

for (int index = 1; index < Items.Count; index++)
{
    Items[index - 1].Number = index;
}

【讨论】:

  • 这对我来说很难,因为我使用的数据的性质。原来是这样的。我正在导入确实有数字的文件,但在某些情况下,文件只有 2 - 6,我最终得到一个 10 个列表,其中空插槽有 0 我尝试将它们转换为字符/字符串,所以我可以有一个空格而不是 0,但后来我继续尝试这种方式。基本上我只是在学习/尝试不同的选择,我只是想知道是否有可能完成这项工作
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2019-02-03
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多