【问题标题】:WPF Binding to specific propertyWPF 绑定到特定属性
【发布时间】:2010-07-04 18:04:05
【问题描述】:

我是 DataBinding 的新手,但希望完成以下工作:

我有一个包含对象集合的 ViewModel:CollectionOfStuff

每个对象Stuff 都有一些属性:NameValue

在我看来,我有一个 StackPanel 和一些 TextBlocks。我想将 TextBlock 的 Text 属性绑定到特定属性。 (当NameStuff 是“某个名称”时,我想绑定到Value

在我的StackPanel 上,我已将DataContext 设置为集合。

但是对于文本块,当我尝试 ...Text="{Binding Path=Value"} ...我只得到CollectionOfStuff 中的第一个对象。当Name 是“某个名称”时,如何选择性地绑定到对象的Value

【问题讨论】:

  • “某个名称”是否特定于每个文本框?
  • 是的,例如 TextBlock 将是标题,所以我基本上想要 Name = "Title" 的 Stuff 对象的值

标签: c# wpf mvvm binding


【解决方案1】:

认为,根据您的描述,您想使用 ItemsControl,它默认由 StackPanel 支持。它将使用给定的模板显示您的所有项目(我包括一个非常简单的模板)。它看起来像这样:

<ItemsControl ItemsSource="{Binding CollectionOfStuff}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
                <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这是你想做的吗?如果是这样,请忽略其余部分。

但是,如果您希望绑定到列表中的特定项目,则需要确保 CollectionOfStuff 实现了 this[string index] 索引器(非常重要的步骤)。然后,您可以通过名称来调用它:

<StackPanel DataContext="{Binding CollectionOfStuff['theName']}"></StackPanel>
    <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
    <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
</StackPanel>

如果您要走这条路,但您无法控制 CollectionOfStuff 的集合类型,那么您始终可以在 ViewModel 上创建自己的索引器:

public object this[string indexer]
{
    get
    {
        return CollectionOfStuff.FirstOrDefault(s => s.Name == indexer);
    }
}

然后,您的 StackPanel 上的 DataContext 将如下所示:DataContext="{Binding ['theName']}"

我想这完全取决于你想要做什么。您的解决方案在这个答案的某个地方:)

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2011-02-01
    • 1970-01-01
    • 2011-04-29
    • 2014-06-07
    • 2010-10-05
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多