【问题标题】:Not getting value from StackPanel没有从 StackPanel 获得价值
【发布时间】:2016-10-20 00:41:33
【问题描述】:

我在从堆栈面板获取确切值时遇到问题。

XAML

<Page
x:Class="MedicinesApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MedicinesApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
    <CollectionViewSource x:Name="MedicinesCollectionViewSource" IsSourceGrouped="True" />
</Page.Resources>
<GridView
    ItemsSource="{Binding Source={StaticResource MedicinesCollectionViewSource}}"
    x:Name="MedicinesGridView"
    Padding="30,20,40,0"
    SelectionMode="Single"
    IsSwipeEnabled="false"
    IsItemClickEnabled="True" SelectionChanged="MedicinesGridView_SelectionChanged"
    ItemClick="MedicinesGridView_ItemClick">
    <GridView.ItemTemplate>
        <DataTemplate x:Name="templateTrending">
            <Grid HorizontalAlignment="Left" Width="250" Height="250" x:Name="wow">
                <Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}">
                <Image Source="{Binding Path=DiseaseImageSource}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
                </Border>
                <StackPanel VerticalAlignment="Bottom" Background="{ThemeResource ListViewItemOverlayBackgroundThemeBrush}">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="Disease Name" Foreground="{ThemeResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextBlockStyle}" Height="30" Margin="15,0,15,0"/>
                        <TextBlock x:Name="DiseaseNameBro" Text="{Binding Path=DiseaseName, Mode=TwoWay}" Style="{StaticResource TitleTextBlockStyle}" Height="30" Margin="15,0,15,0"/>
                    </StackPanel>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="Category of Disease" Foreground="{ThemeResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" Margin="15,0,87,10"/>
                        <TextBlock Text="{Binding Path=CategoryOfDisease}" Foreground="{ThemeResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
                    </StackPanel>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>
    <GridView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text='{Binding Key}' Foreground="Gray" Margin="5" FontSize="30" FontFamily="Segoe UI Light" />
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <VariableSizedWrapGrid MaximumRowsOrColumns="2" Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>
    </GridView.GroupStyle>
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid GroupPadding="0,0,70,0" />
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
</GridView>

C#

    using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Windows.UI.Xaml.Controls;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace MedicinesApp
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public string getMedicinesName;
        public ObservableCollection<Disease> diseaseList = new ObservableCollection<Disease>();
        public MainPage()
        {
            this.InitializeComponent();
            diseaseList.Add(new Disease { DiseaseName = "Malaria", DiseaseImageSource = "/Assets/133px-Malaria.jpg", CategoryOfDisease = "Blood" });
            diseaseList.Add(new Disease { DiseaseName = "Typhod", DiseaseImageSource = "../Assets/apple.jpg", CategoryOfDisease = "Thorat" });
            diseaseList.Add(new Disease { DiseaseName = "Cancer", DiseaseImageSource = "../Assets/orange.jpg", CategoryOfDisease = "Body" });
            diseaseList.Add(new Disease { DiseaseName = "Headache", DiseaseImageSource = "../Assets/bilberry.jpg", CategoryOfDisease = "Brain" });
            //diseaseList = new ObservableCollection<Disease>(diseaseList.OrderBy(c => c.DiseaseName));
            MedicinesCollectionViewSource.Source = GetGroupsByLetter();
        }
        internal List<GroupInfoList<object>> GetGroupsByLetter()
        {
            var groups = new List<GroupInfoList<object>>();
            var query = from item in diseaseList
                        orderby item.DiseaseName
                        group item by item.DiseaseName[0] into g
                        select new { GroupName = g.Key, Items = g };
            foreach (var g in query)
            {
                var info = new GroupInfoList<object>();
                info.Key = g.GroupName;
                foreach (var item in g.Items)
                {
                    info.Add(item);
                }

                groups.Add(info);
            }
            return groups;
        }
        public class GroupInfoList<T> : List<object>
        {
            public object Key { get; set; }

            public new IEnumerator<object> GetEnumerator()
            {
                return base.GetEnumerator();
            }
        }
        public class Disease
        {
            public string DiseaseName { get; set; }
            public string DiseaseImageSource { get; set; }
            public string CategoryOfDisease { get; set; }
        }
        private void MedicinesGridView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            getMedicinesName = ((Disease)MedicinesGridView.SelectedItem).DiseaseName;
        }
        private void MedicinesGridView_ItemClick(object sender, ItemClickEventArgs e)
        {
            this.Frame.Navigate(typeof(malaria), getMedicinesName);
        }
    }

问题是每当我点击疟疾时, 它转到另一页并显示癌症,这是列表中的第一个值。 我怎样才能获得我点击的项目的价值,而不是第一个项目的价值。我已附上屏幕截图,以便您更好地了解事物。

【问题讨论】:

    标签: c# xaml windows-store-apps observablecollection listviewitem


    【解决方案1】:

    我查看了您的代码,但有一件事我不明白。 为什么要使用 2 个事件进行导航。只有一个人可以完成这项工作。

        private void MedicinesGridView_ItemClick(object sender, ItemClickEventArgs e)
        {
            var selectedDisease = e.ClickedItem as Disease;
            this.Frame.Navigate(typeof(malaria), selectedDisease);
        }
    

    您也不需要 getMedicinesName。

    不要忘记从您的代码和 XAML 中删除 SelectionChanged 事件。

    【讨论】:

    • 谢谢您的回复。我用了两个事件来尝试一些东西。不管怎样,我按照你说的做了,但它在下一页显示了 Medicinesapp.Diease 之类的东西。为什么会这样?我应该把它扔给疾病吗?
    • 嘿,我想通了。在疾病类中,我忘记覆盖 ToString 方法,我将其设置为这样 public override string ToString() { return DiseaseName; }
    猜你喜欢
    • 2018-04-08
    • 2012-06-24
    • 1970-01-01
    • 2021-10-31
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多