【问题标题】:Windows Phone C# Iterate through ListView child controlsWindows Phone C# 遍历 ListView 子控件
【发布时间】:2015-07-17 14:35:23
【问题描述】:

我在使用适用于 Windows Phone 的 ListView 时遇到问题: 我正在使用数据绑定来显示文件夹中的所有项目,但是当我尝试遍历它们时,我没有获得控件,但是我用来获取应用程序的 LocalFolder 中的项目的类(subjectpicker 类)!

SubjectPicker 类:

class SubjectPicker {
    public static async Task<List<SubjectPicker>> SubjectData() {
        List<string> Names = new List<string>();
        List<Brush> Colors = new List<Brush>();
        List<string> Items = new List<string>();
        List<List<TestOrTask>> TestsAndTasks = new List<List<TestOrTask>>();

        StorageFolder LocalFolder = ApplicationData.Current.LocalFolder;
        var files = await LocalFolder.GetFilesAsync();
        foreach (var file in files) {
            //await file.DeleteAsync();
            List<TestOrTask> TAT = new List<TestOrTask>();

            Names.Add(file.DisplayName);

            bool readItems = false;
            var contents = await FileIO.ReadLinesAsync(file);
            foreach (var content in contents) {
                if (content.Contains("Subject Color")) {
                    string colorname = content.Replace("Subject Color: ", "");
                    Colors.Add(ColorConverter.fromString_Brush(colorname));
                }
                else if (content == "<Items>") readItems = true;
                else if (content == "</Items>") readItems = false;

                if (readItems == true && content != "") {
                    // Layout: <Name>: <Score>/<Maximum>|<YYYY>/<MM>/<DD> 
                    string name = content.Split(':')[0];
                    string Score = content.Split(':')[1].Replace(" ", "");
                    string Date = content.Split('|')[1];
                    TestOrTask TOT = new TestOrTask(
                        name,
                        double.Parse(Score.Split('/')[0]),
                        double.Parse(Score.Split('/')[1]),
                        new DateTime(
                            Int32.Parse(Date.Split('/')[0]),
                            Int32.Parse(Date.Split('/')[1]),
                            Int32.Parse(Date.Split('/')[2])));
                    TAT.Add(TOT);
                }
            }
            Items.Add("Aantal Testen & Taken: " + TAT.Count.ToString());
            TestsAndTasks.Add(TAT);
        }

        var data = new List<SubjectPicker>();
        for (int i = 0; i < Names.Count; i++) {
            data.Add(new SubjectPicker(Names[i], Colors[i], Items[i], TestsAndTasks[i]));
        }

        return data;
    }

    public SubjectPicker(string name, Brush color, string itemstotal, List<TestOrTask> TestsAndTasks) {
        PickerName = name;
        PickerColor = color;
        ItemTotal = itemstotal;
        this.TestsAndTasks = TestsAndTasks;
    }

    public string PickerName { get; set; }
    public Brush PickerColor { get; set; }
    public string ItemTotal { get; set; }
    public List<TestOrTask> TestsAndTasks = new List<TestOrTask>();
}

Xaml 代码:

<Page.Resources>
    <DataTemplate x:Key="SubjectTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Border Margin="0,9.5,0,0" Background="Transparent" >
                <Rectangle  Height="50" Width="50" Fill="{Binding PickerColor}" RadiusX="5" RadiusY="5"/>
            </Border>
            <StackPanel Grid.Column="1" Margin="14.5,0,0,0">
                <TextBlock Text="{Binding PickerName}" Style="{ThemeResource ListViewItemTextBlockStyle}" />
                <TextBlock Text="{Binding ItemTotal}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</Page.Resources>

<Page.BottomAppBar>
    <CommandBar x:Name="AppBar" Visibility="Collapsed">
        <AppBarButton x:Name="EditSubject" Icon="Edit" Label="Aanpassen" Click="EditSubject_Click"/>
        <AppBarButton x:Name="DeleteSubject" Icon="Delete" Label="Verwijderen" Click="DeleteSubject_Click"/>
    </CommandBar>
</Page.BottomAppBar>

<Grid x:Name="MainGrid" Loaded="MainGrid_Loaded">
    <Controls:TopBarControl x:Name="TopBarControl" Margin="0" VerticalAlignment="Top" PageName="Vakken" ControlsVisible="All" Width="Auto" BackButtonClicked="TopBar_BackButtonClicked" AddButtonClicked="TopBar_AddButtonClicked" EditButtonClicked="TopBar_EditButtonClicked"/>
    <Grid x:Name="ControlsGrid" Margin="0,50,0,-60" Tapped="ControlsGrid_Tapped">
        <ListView x:Name="SubjectList" ItemsSource="{Binding}" ItemTemplate="{StaticResource SubjectTemplate}"/>
    </Grid>
</Grid>

无法迭代:

private async Task SelectSubjects() {
    for (int i = 0; i < SubjectList.Items.Count; i++) {
        var control = SubjectList.Items[i];
        Grid subject = control as Grid;
        if (subject != null) {
            subject.Background = new SolidColorBrush(SchoolToolsColors.AppColor);
            await Task.Delay(TimeSpan.FromMilliseconds(50));
        }
    }
    isSelecting = true;
    AppBarVisible = Visibility.Visible;
}

提前致谢!!!

【问题讨论】:

    标签: c# xaml listview windows-phone


    【解决方案1】:

    在对数据绑定控件进行迭代时,您将始终获得其基础数据。

    您应该Style.Triggers 根据数据更改 UI(更改背景、显示/隐藏控件等)。

    但是,有一种方法可以从 C# 更改 UI,但这会使 XAML 和代码隐藏紧密耦合 => 会在您的代码中引入更多复杂性 - 相信我,这不是您想要/需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2017-11-04
      相关资源
      最近更新 更多