以编程方式更改 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 以编程方式编辑模式

如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

如何以编程方式在 ASP.NET 4.0 GridView 上启用分页和排序?

以编程方式创建网格视图

如何以编程方式获取音乐专辑封面

当输入的值以编程方式更改时触发更改事件