以编程方式更改GridView ItemTemplate中的数据绑定属性

时间:2013-09-07 00:01:05

标签: c# winrt-xaml

我有一个C#和XAML项目,它涉及一个绑定到名为myList的Slides的ObservableCollection的GridView。 Slide有两个感兴趣的属性 - 名称和描述。默认情况下,GridView中的项目显示Name属性,但我想要一个按钮在显示Name和显示Description之间切换。

摘自幻灯片:

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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;
        }
    }