1

我有一个 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 中的动态内容执行此操作。有小费吗?

我剪掉了一堆看起来多余的代码,但如果您需要任何其他信息,请告诉我。

谢谢!

4

2 回答 2

0

也许我不完全理解,但似乎你应该只制作一个单独的 TextBlock 控件,并在单击按钮时以编程方式隐藏/显示每个数据绑定的 TextBlock。

编辑:找到这个答案以帮助提高可见性(我没有太多 XAML 经验)。如果这只能在数据绑定事件上执行,那么可以考虑创建一个全局布尔 ShowName,并在按下按钮时切换该布尔值,然后启动 GridView 的数据绑定事件。然后该事件将检查布尔值并显示/隐藏正确的 TextBlock。

于 2013-09-07T00:33:39.283 回答
0

确实必须编写一些重复的 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;
        }
    }
于 2013-09-07T08:23:09.867 回答