【问题标题】:Programmatically change databound property in GridView ItemTemplate以编程方式更改 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 的情况下做到这一点。

标签: c# winrt-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 应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多