【问题标题】:DataBinding to a List in silverlight在silverlight中将数据绑定到列表
【发布时间】:2011-10-24 19:03:02
【问题描述】:

我有一个包含 TextBlock 的网格。 Grid 的 DataContext 是 List<MyClass> 类型,我想将 TextBlock.Text 属性绑定到 List 中第一个元素的 MyClass.MyProperty 属性。我试过类似的东西:

<Grid x:Name="RootLayout">
    <TextBlock Text="{Binding [0].MyProperty}" />
</Grid>

当然,这并没有奏效。这样做的正确方法是什么?

编辑:

我将尝试使我的解释更清楚。我在网格中有多个元素,每个元素都绑定到列表中的不同项目。项目以自定义方式布局,这是 GridView 或 ListBox 无法完成的。网格中的一项是 TextBlock,我想将其 Text 属性绑定到列表中第一个元素的属性。一旦我知道如何做到这一点,我就可以扩展该知识以将绑定添加到网格中的其余元素。

编辑 2:

事实证明,我的代码在 Silverlight 中运行良好。我的项目实际上是一个 WinRT 项目,但我想如果我将它标记为 Silverlight,我会得到更快的答案,因为数据绑定应该是一样的。我假设这是 WinRT 中的一个错误,所以我只需要找到一个解决方法:(

【问题讨论】:

  • 第一个问题:你想显示所有项目还是只显示第一个?如果您想要所有项目,则需要 List 或 DataGrid 或其他支持多个项目的容器(例如,通过 ItemsSource 属性)。
  • @HiTech Magic 我需要所有物品。但是,我需要的布局并不完全适用于 ListBox 或 DataGrid。我还在为 Grid 中的每个单独项目添加动画,从而使事情变得更加复杂。
  • 再读几遍,我只是不确定我们是否清楚地了解您在这里的目的。您需要列表中的所有项目,但您只希望 TextBox 绑定到列表中第一个项目的属性 - 网格中的其他控件是否绑定到列表中的其他项目?您是否有一个控件要用于迭代列表并让 TextBox 在您浏览时显示列表中每个项目的 MyProperty?

标签: silverlight data-binding


【解决方案1】:

我不确定我明白您为什么要这样做,但您可以创建一个属性,从列表中的项目返回您想要的内容,如下所示:

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}" />

如果你需要我,我会在角落里享用我简陋的馅饼。

【讨论】:

  • 这会破坏使用 DataContext 的目的:) 无论哪种方式,TextBlock 都不是唯一依赖于 List 的元素,因为它是数据上下文,因此必须这样做真的很乏味为每个绑定定义额外的属性
  • 当你说这会破坏目的时,我不是在关注你吗?
  • 数据上下文应该作为数据源;添加代理属性只会增加额外的开销,我可以通过将数据上下文从列表修改为包含列表的容器来避免。但是,我想看看是否可以在不修改代码行为的情况下完成此操作。
  • 我了解DataContext 的工作原理。我的观点是,我不知道你是否可以做你想做的任何其他方式 - TextBox.Text 是一个字符串属性,所以除非我错了(请纠正我)它看起来会被绑定到一个字符串,或者它会在你绑定到的任何东西上调用ToString() - 在这种情况下,你会得到“System.Collections.Generic.List”或类似的东西,我不相信在定义绑定以诱使它迭代列表或获取列表中的特定条目,因此可以使用包装器属性来获取您想要的内容。或使用ListBox
  • MyProperty 是字符串类型。由于我不只是绑定到列表中元素的属性,因此我不会得到“System.Collections.Generic.List
【解决方案2】:

我不是SL 的专家,但我认为您使用了错误的Grid 对象;以这种方式尝试DataGrid

<data:DataGrid x:Name="targetDataGrid">
     <data:DataGrid.Columns>
         <data:DataGridTextColumn Header="MyProperty" 
             Binding="{Binding MyProperty}" />
     </data:DataGrid.Columns>
 </data:DataGrid>

更多详情请参见此处:Defining Silverlight DataGrid Columns at Runtime

编辑:然后往这边走:

<Grid>
  <Grid.ColumnDefinitions>
  <ColumnDefinition />
  </Grid.ColumnDefinitions>
  <TextBlock Grid.Column="0" Text="{Binding MyProperty}" />
</Grid>

在这里找到:http://msdn.microsoft.com/en-us/library/cc278072%28v=VS.95%29.aspx 向下滚动文章...

【讨论】:

  • 不幸的是,我无法使用 DataGrid 或 ListBox,因为我省略了其他限制以保持示例简洁。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多