在silverlight中数据绑定到列表
我有一个包含文本块的网格。网格的DataContext类型为在silverlight中数据绑定到列表,silverlight,data-binding,Silverlight,Data Binding,我有一个包含文本块的网格。网格的DataContext类型为List,我想将TextBlock.Text属性绑定到列表中第一个元素的MyClass.MyProperty属性。我试过这样的方法: <Grid x:Name="RootLayout"> <TextBlock Text="{Binding [0].MyProperty}" /> </Grid> 但当然,这是行不通的。正确的做法是什么 编辑: 我要试着把我的解释弄清楚。网格中有多个元素,每
List
,我想将TextBlock.Text属性绑定到列表中第一个元素的MyClass.MyProperty属性。我试过这样的方法:
<Grid x:Name="RootLayout">
<TextBlock Text="{Binding [0].MyProperty}" />
</Grid>
但当然,这是行不通的。正确的做法是什么
编辑:
我要试着把我的解释弄清楚。网格中有多个元素,每个元素都绑定到列表中的不同项。项目以定制的方式布置,这是GridView或ListBox无法完成的。网格中的一项是TextBlock,我想将其Text属性绑定到列表中第一个元素的属性。一旦我知道如何做到这一点,我就可以扩展这些知识,向网格中的其余元素添加绑定
编辑2:
事实证明,我的代码在Silverlight中运行良好。我的项目实际上是一个WinRT项目,但是我想如果我把它标记为Silverlight,我会得到更快的答案,因为数据绑定应该是一样的。我假设这是WinRT中的一个bug,所以我必须找到一个解决方法:(我不是
SL
的专家,但我认为您使用了错误的Grid
对象;用这种方式尝试DataGrid
:
<data:DataGrid x:Name="targetDataGrid">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="MyProperty"
Binding="{Binding MyProperty}" />
</data:DataGrid.Columns>
</data:DataGrid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding MyProperty}" />
</Grid>
有关更多详细信息,请参见此处:
编辑:然后按以下方式操作:
<data:DataGrid x:Name="targetDataGrid">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="MyProperty"
Binding="{Binding MyProperty}" />
</data:DataGrid.Columns>
</data:DataGrid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding MyProperty}" />
</Grid>
在此处找到:滚动浏览文章…我不知道您为什么要这样做,但您可以创建一个属性,从列表中的项目返回所需内容,如下所示:
public string MyBindingProperty
{
get { return MyList != null && MyList.Count > 0 ? MyList[0].MyProperty : "Error Text"; }
}
然后绑定到MyBindingProperty
:
<TextBlock Text="{Binding MyBindingProperty}" />
编辑
我说你无法获取列表中的项目是错误的-我的错。你的绑定应该如下所示:
<TextBlock Text="{Binding [0].MyProperty}" />
如果您需要我,我会在角落里享受我的谦卑。不幸的是,由于其他限制,我无法使用DataGrid或ListBox,我忽略了这些限制,以保持示例的简洁性。第一个问题:您想显示所有项目还是只显示第一个项目?如果您想要所有项目,请使用列表或DataGrid或其他支持多个项目的容器(例如,通过ItemsSource属性)是必需的。@HiTech Magic我需要所有项目。但是,我需要的布局与ListBox或DataGrid不完全匹配。我还在为网格中的每个项目添加动画,这会使事情进一步复杂化。再通读几遍,我只是不确定我们是否能清楚地了解您的意图。您知道吗需要列表中的所有项目,但您只希望文本框绑定到列表中第一个项目的属性-网格中的其他控件是否绑定到列表中的其他项目?您是否有一个控件要用于迭代列表,并在遍历时让文本框显示列表中每个项目的MyProperty?这将使p失败使用DataContext的目的:)无论如何,TextBlock并不是唯一依赖列表作为其数据上下文的元素,因此必须为每个绑定定义额外的属性实在是太麻烦了。当你说它将无法达到目的时,我没有听你的。数据上下文应该充当数据源;添加代理属性只会增加额外的开销,而我认为可以通过将我的数据上下文从列表修改为包含列表的容器来避免。但是,我想看看我是否可以在不修改codebehing的情况下实现这一点。我了解
DataContext
的工作原理。我的观点是,我不知道你是否可以用任何其他方式完成你想做的事情-TextBox。文本是字符串属性,所以除非我错了(请纠正我),否则它看起来会绑定到一个字符串,否则它将对您绑定到的任何对象调用ToString()或者类似的东西,我不相信在定义绑定时有任何方法可以诱使它迭代列表或获取列表中的特定条目,从而得到一个包装器属性来获得所需的内容。或者使用列表框
。MyProperty是string类型。因为我不仅仅绑定到列表中某个元素的属性,所以我不会无法获取“System.Collections.Generic.List”