无法在属性

时间:2015-11-26 00:51:40

标签: c# wpf xaml

好的,让我重新说出问题要更清楚,并确切地问我想要完成什么。

我有一个网络服务,从我的数据库中选择前10篇文章(我选择ID,标题,正文,作者,日期)并将它们存储在对象列表中(每个对象有5个项目)。然后我调用该Web服务并使用返回的对象列表构建我的GridView。所以在任何时候,我都可以在我的页面上有1-10个GridViewItems(在我的例子中是Tiles)(取决于我列表中的对象数量)。

根据我对ASP.net的经验,比方说我正在填写查询的下拉列表。假设我的查询返回2列(ID,Name)。我会将DataTextField设置为名称,将DataTextValue设置为 ID

我在这里寻找相同的功能。当我单击每个GridViewItem(平铺)中生成的按钮时,我希望能够从该特定文章中提取ID。我知道在绑定GridView时我需要存储该ID,因此当我点击阅读更多按钮时我可以使用它。

我的最终产品是当用户点击10篇文章之一的阅读更多按钮时,它会将它们带到该文章的详细页面,向其显示整个文章正文等。我将通过文章 ID 从我的数据库中提取此信息。这就是为什么我将文章ID 正确地绑定到每个GridViewItem是非常重要的,所以我可以提取值并稍后使用它。

我将在我的代码下面发布我如何构建Gridview等等。

<Page.Resources>
    <DataTemplate x:Key="TileTemplate">
        <StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top">
            <TextBlock x:Name="TitleBlock" Text="{Binding TitleView}" FontFamily="Segoe UI" FontWeight="SemiBold" FontSize="22" Foreground="White" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10"></TextBlock>
            <TextBlock x:Name="BodyBlock" Text="{Binding BodyView}" FontFamily="Segoe UI" FontWeight="Light" FontSize="16" Foreground="White" TextWrapping="Wrap" Height="110" Width="280" Margin="10,0"></TextBlock>
            <Button x:Name="ReadMoreButton" Content="Read more" Click="btnOpenArticle_Click" HorizontalAlignment="Right"></Button>
        </StackPanel>
    </DataTemplate>
</Page.Resources>

<Grid x:Name="tileGrid" Background="LightGray">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>

    <controls:PageHeader BackButtonVisibility="Collapsed" Content="News" Frame="{x:Bind Frame}">
        <Interactivity:Interaction.Behaviors>
            <Behaviors:EllipsisBehavior Visibility="Auto" />
        </Interactivity:Interaction.Behaviors>
        <controls:PageHeader.SecondaryCommands>
            <AppBarButton Click="{x:Bind ViewModel.GotoPrivacy}" Label="Privacy" />
            <AppBarButton Click="{x:Bind ViewModel.GotoAbout}" Label="About" />
        </controls:PageHeader.SecondaryCommands>
    </controls:PageHeader>

    <GridView x:Name="tileGridView" Margin="12,60" ItemTemplate="{StaticResource TileTemplate}">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>

        <GridView.ItemContainerStyle>
            <Style TargetType="GridViewItem">
                <Style.Setters>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid Background="#2A2A2A"
                                  Margin="5"
                                  Height="200"
                                  Width="300">
                                    <ContentPresenter />
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style.Setters>
            </Style>
        </GridView.ItemContainerStyle>
    </GridView>
</Grid>

代码背后:

 public async void ViewData()
    {
        ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
        List<GetTileDetails> TileList = new List<GetTileDetails>();

        var res = await client.ViewDetailsAsync();
        for (int i = 0; i < res.Count; i++)
        {
            TileList.Add(new GetTileDetails(res[i].TitleView, res[i].BodyView.Substring(0,170) + " ...", res[i].IDView));
        }
        tileGridView.ItemsSource = TileList;
    }

 public class GetTileDetails
    {
        public string TitleView { get; set; }
        public string BodyView { get; set; }
        public int IDView { get; set; }

        public GetTileDetails() { }
        public GetTileDetails(string myTitleView, string myBodyView, int myIDView)
        {
            this.TitleView = myTitleView;
            this.BodyView = myBodyView;
            this.IDView = myIDView
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以使用所有FrameworkElements中存在的Tag属性作为精彩的数据存储。

<Button ... Tag="{Binding ID}" Click="Btn_Click"></Button>

在Click事件处理程序中,您可以轻松访问发件人并访问其Tag属性。

答案 1 :(得分:0)

而不是使用Click,而是将按钮的Command绑定到您的视图模型(通过ICommand)。然后,您可以存储TileView属性的值。