以编程方式更改 GridView ItemTemplate 中的数据绑定属性
Posted
技术标签:
【中文标题】以编程方式更改 GridView ItemTemplate 中的数据绑定属性【英文标题】:Programmatically change databound property in GridView ItemTemplate 【发布时间】:2013-09-11 04:10:56 【问题描述】:我有一个 C# 和 XAML 项目,其中涉及绑定到名为 myList 的幻灯片的 ObservableCollection 的 GridView。幻灯片有两个感兴趣的属性 - 名称和描述。默认情况下,GridView 中的项目显示名称属性,但我想要一个按钮在显示名称和显示描述之间切换。
幻灯片摘录:
public class Slide : INotifyPropertyChanged
private string _Name;
private string _Description;
public string Name
get
return this._Name;
set
//snipped for convenience: check that the property has changed and set it
public string Description
get
return this._Description;
set
//snipped for convenience: check that the property has changed and set it
/*etc...*/
XAML 现在看起来像这样:
<GridView /*...*/ ItemsSource="Binding myList">
<GridView.ItemTemplate>
<DataTemplate>
<Grid /*...*/ >
<TextBlock /*...*/ Text="Binding Name" />
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
当用户单击按钮时,我想以编程方式更改绑定到 DataTemplate 中 TextBlock 的 Text 字段的属性,从而更改 GridView 中的每个项目。我知道如何为单个 XAML 元素执行此操作,但我不确定如何为 GridView 中的动态内容执行此操作。有小费吗?
我剪掉了一堆看起来多余的代码,但如果您需要任何其他信息,请告诉我。
谢谢!
【问题讨论】:
我找到了this question and answer,这表明我创建了第二个绑定到另一个属性的 GridView 并在两者之间切换。我想这会起作用,但似乎必须有一种方法可以在不编写两次 XAML 的情况下做到这一点。 【参考方案1】:我确实必须编写一些重复的 XAML,但我不必复制整个 GridView 或做任何显示/隐藏技巧。我向 Page.Resources 添加了两个 DataTemplates,如下所示:
<DataTemplate x:Key="SideATemplate" x:Name="SideATemplate">
<Grid Background="White" Width="400" Height="200">
<TextBlock /*snip*/ Text="Binding Name" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="SideBTemplate" x:Name="SideBTemplate">
<Grid Background="White" Width="400" Height="200">
<TextBlock /*snip*/ Text="Binding Description" />
</Grid>
</DataTemplate>
在交换它们的按钮的事件处理程序中,我可以更改模板:
private void Flipbtn_Tapped(object sender, TappedRoutedEventArgs e)
if (/*Snip conditional stuff*/)
SlidesGridView.ItemTemplate = SideBTemplate;
else
SlidesGridView.ItemTemplate = SideATemplate;
【讨论】:
【参考方案2】:也许我没有完全理解,但您似乎应该只制作一个单独的 TextBlock 控件,并在单击按钮时以编程方式隐藏/显示每个数据绑定的 TextBlock。
编辑: 找到 this 答案以帮助解决可见性方面的问题(我没有太多 XAML 经验)。如果这只能在数据绑定事件上执行,那么可以考虑创建一个全局布尔 ShowName,并在按下按钮时切换该布尔值,然后启动 GridView 的数据绑定事件。然后该事件将检查布尔值并显示/隐藏正确的 TextBlock。
【讨论】:
不幸的是,在链接的答案中使用的 DataTriggers 不适用于 Windows RT 应用程序。以上是关于以编程方式更改 GridView ItemTemplate 中的数据绑定属性的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?