2010-07-04 158 views
0

我是新来的数据绑定,但想完成以下任务:WPF绑定到特定的属性

我有一个视图模型具有对象的集合:CollectionOfStuff

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

在我看来,我有一个StackPanel与一些TextBlock s。我想将TextBlock的Text属性绑定到特定属性。 (我想结合ValueStuffName是“有些名”)

在我StackPanel我已经设置了DataContext到集合。

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

+0

是“某个名称”特定于每个文本框? – 2010-07-04 18:10:37

+0

是的,例如一个TextBlock将是标题,所以我基本上需要的东西的对象的值,其中名称=“标题” – 2010-07-04 18:11:42

回答

3

想想,从你的描述中,你想使用一个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 implents一个this[string index]索引(非常重要的一步)。然后,您可以通过名字来称呼它:

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

如果你要这条路线,但你没有集合类型的控件CollectionOfStuff是,那么你总是可以创建自己的索引你的视图模型:

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

然后,你对你的StackPanel的DataContext应该是这样的:DataContext="{Binding ['theName']}"

我想这一切都取决于,究竟是什么,你正在试图做的。你的解决方案是在这个答案的某个地方:)