Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# xamarin表单-填充集合视图中的列表视图_C#_Xamarin.forms - Fatal编程技术网

C# xamarin表单-填充集合视图中的列表视图

C# xamarin表单-填充集合视图中的列表视图,c#,xamarin.forms,C#,Xamarin.forms,我使用的是Xamarin Forms集合视图,在该集合视图中是toolkit expander,当有人单击标题时,我绑定了一个命令,在该命令中,我尝试在expander的网格中填充一个列表视图,请参见下面的代码: <CollectionView x:Name="MathList" HeightRequest="320" SelectionChanged="MathList_SelectionChanged">

我使用的是Xamarin Forms集合视图,在该集合视图中是toolkit expander,当有人单击标题时,我绑定了一个命令,在该命令中,我尝试在expander的网格中填充一个列表视图,请参见下面的代码:

<CollectionView x:Name="MathList" HeightRequest="320" SelectionChanged="MathList_SelectionChanged">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <xct:Expander Command="{Binding GetMathSubCatgories}">
                            <xct:Expander.Header>
                                <Frame Padding="10" Margin="10" HasShadow="False" BorderColor="LightGray" VerticalOptions="CenterAndExpand">
                                    <StackLayout Orientation="Horizontal">
                                        <Image Source="{Binding icon}" WidthRequest="25" HeightRequest="25"></Image>
                                        <Label Text="{Binding name}" TextColor="{Binding textColor}" FontSize="Large" FontAttributes="Bold" HeightRequest="35" VerticalOptions="CenterAndExpand"></Label>
                                    </StackLayout>
                                </Frame>
                            </xct:Expander.Header>
                            <Grid Padding="10">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <ListView x:Name="SubCatgories" ItemsSource="{Binding subTaskClass}">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <StackLayout>
                                                <Frame Padding="10" Margin="10" HasShadow="False" BorderColor="LightGray" VerticalOptions="CenterAndExpand">
                                                    <StackLayout Orientation="Horizontal">
                                                        <Label Text="aaa" FontAttributes="Bold" HeightRequest="35" VerticalOptions="CenterAndExpand"></Label>
                                                    </StackLayout>
                                                </Frame>
                                            </StackLayout>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                            </Grid>
                        </xct:Expander>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
它说子目录不可用。如何在数据集合中填充列表视图

我也尝试过这种方法,但仍然一无所获:

<CollectionView x:Name="MathList" HeightRequest="320" SelectionChanged="MathList_SelectionChanged">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <xct:Expander Command="{Binding GetMathSubCatgories}">
                            <xct:Expander.Header>
                                <Frame Padding="10" Margin="10" HasShadow="False" BorderColor="LightGray" VerticalOptions="CenterAndExpand">
                                    <StackLayout Orientation="Horizontal">
                                        <Image Source="{Binding icon}" WidthRequest="25" HeightRequest="25"></Image>
                                        <Label Text="{Binding name}" TextColor="{Binding textColor}" FontSize="Large" FontAttributes="Bold" HeightRequest="35" VerticalOptions="CenterAndExpand"></Label>
                                    </StackLayout>
                                </Frame>
                            </xct:Expander.Header>
                            <Grid Padding="10">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <ListView x:Name="SubCatgories" ItemsSource="{Binding subCategories}">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <StackLayout>
                                                <Frame Padding="10" Margin="10" HasShadow="False" BorderColor="LightGray" VerticalOptions="CenterAndExpand">
                                                    <StackLayout Orientation="Horizontal">
                                                        <Label Text="{Binding name}" FontAttributes="Bold" HeightRequest="35" VerticalOptions="CenterAndExpand"></Label>
                                                    </StackLayout>
                                                </Frame>
                                            </StackLayout>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                            </Grid>
                        </xct:Expander>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

从你的代码,我做了一个例子,你可以看看

 <CollectionView
        x:Name="MathList"
        ItemsSource="{Binding catgories}"
        SelectedItem="{Binding selecteditem}"
        SelectionMode="Single">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <xct:Expander Command="{Binding command1}">
                    <xct:Expander.Header>
                        <Frame
                            Margin="10"
                            Padding="10"
                            BorderColor="LightGray"
                            HasShadow="False"
                            VerticalOptions="CenterAndExpand">
                            <StackLayout Orientation="Horizontal">
                                <Image
                                    HeightRequest="25"
                                    Source="{Binding icon}"
                                    WidthRequest="25" />
                                <Label
                                    FontAttributes="Bold"
                                    FontSize="Large"
                                    HeightRequest="35"
                                    Text="{Binding name}"
                                    TextColor="{Binding textColor}"
                                    VerticalOptions="CenterAndExpand" />
                            </StackLayout>
                        </Frame>
                    </xct:Expander.Header>
                    <Grid Padding="10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <ListView x:Name="SubCatgories" ItemsSource="{Binding subtasks}">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell>


                                        <StackLayout>
                                            <Frame
                                                Margin="10"
                                                Padding="10"
                                                BorderColor="LightGray"
                                                HasShadow="False"
                                                VerticalOptions="CenterAndExpand">
                                                <StackLayout Orientation="Horizontal">
                                                    <Label
                                                        FontAttributes="Bold"
                                                        HeightRequest="35"
                                                        Text="{Binding name}"
                                                        VerticalOptions="CenterAndExpand" />
                                                </StackLayout>
                                            </Frame>
                                        </StackLayout>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </Grid>
                </xct:Expander>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>

  public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new SubCatgories();
    }
}
public class SubCatgories : INotifyPropertyChanged
{
    public ObservableCollection<TaskClass> catgories { get; set; }
    public ICommand command1 { get; set; }
    private TaskClass _selecteditem;
    public TaskClass selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");
        }
    }

    public SubCatgories()
    {
        catgories = new ObservableCollection<TaskClass>()
        {
            new TaskClass(){icon="favorite.png",name="catgory 1",textColor=Color.Black,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
             new TaskClass(){icon="check.png",name="catgory 2",textColor=Color.Blue,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
              new TaskClass(){icon="delete.png",name="catgory 3",textColor=Color.YellowGreen,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
               new TaskClass(){icon="flag.png",name="catgory 4",textColor=Color.ForestGreen,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
        };

        selecteditem = catgories[0];
        command1 = new Command(() => { Console.WriteLine(selecteditem.name); });
    }
  
    public event PropertyChangedEventHandler PropertyChanged;    
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class TaskClass
{
    public string icon { get; set; }
    public string name { get; set; }
    public Color textColor { get; set; }

    public ObservableCollection<SubTaskClass> subtasks { get; set; }
}

public class SubTaskClass
{
    public int id { get; set; }
    public int taskcategory { get; set; }
    public string name { get; set; }
}

公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
this.BindingContext=新的子目录();
}
}
公共类子类别:INotifyPropertyChanged
{
公共可观测集合类别{get;set;}
公共ICommand命令1{get;set;}
私有任务类_selecteditem;
公共任务类selecteditem
{
获取{return\u selecteditem;}
设置
{
_选择editem=值;
RaisePropertyChanged(“selecteditem”);
}
}
公共子类别()
{
类别=新的可观测集合()
{
新建TaskClass(){icon=“favorite.png”,name=“catgory 1”,textColor=Color.Black,子任务=new ObservableCollection(){
新建子类(){name=“sub class 1”},新建子类(){name=“sub class 2”},新建子类(){name=“sub class 3”}
} },
新建TaskClass(){icon=“check.png”,name=“catgory 2”,textColor=Color.Blue,子任务=new ObservableCollection(){
新建子类(){name=“sub class 1”},新建子类(){name=“sub class 2”},新建子类(){name=“sub class 3”}
} },
new TaskClass(){icon=“delete.png”,name=“catgory 3”,textColor=Color.YellowGreen,子任务=new ObservableCollection(){
新建子类(){name=“sub class 1”},新建子类(){name=“sub class 2”},新建子类(){name=“sub class 3”}
} },
新建TaskClass(){icon=“flag.png”,name=“catgory 4”,textColor=Color.ForestGreen,子任务=new ObservableCollection(){
新建子类(){name=“sub class 1”},新建子类(){name=“sub class 2”},新建子类(){name=“sub class 3”}
} },
};
选择编辑项=类别[0];
command1=新命令(()=>{Console.WriteLine(selecteditem.name);});
}
公共事件属性更改事件处理程序属性更改;
public void RaisePropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
公共类任务类
{
公共字符串图标{get;set;}
公共字符串名称{get;set;}
公共颜色文本颜色{get;set;}
公共ObservableCollection子任务{get;set;}
}
公共类子类
{
公共int id{get;set;}
公共int任务类别{get;set;}
公共字符串名称{get;set;}
}
截图:


注意:ListView中的数据项称为单元格,请在中添加ViewCell。

首先,将ListView嵌套在CollectionView中是一个非常糟糕的主意,您应该避免这样做。但是,如果必须这样做,CollectionView ItemsSource应该包含所需的嵌套数据,并且应该使用绑定来设置ListView ItemsSource。我已经这样做了,但没有做任何事情,我将举一个我在那里尝试做的例子shortly@Jason我更新了我的问题如果你想动态加载子类,你需要使用INPC并引发PropertyChanged事件。或者像我最初建议的那样,用原始数据加载所有子类别。加载页面时,查看VS的输出窗格。是否有任何错误或警告?此外,当
taskcategoryid
更改时,代码中没有任何内容可以告诉XAML
子类别
属性将返回不同的值
taskcategoryid
必须是带有支持字段的属性。其setter必须包含一行,表明“子类别”属性已更改。阅读“属性更改通知”或“MVVM”或“ViewModel”。查找设置一个属性也会更改另一个属性的示例。(当.NETMAUI是最终版本时,请尝试使用MVU。可能比数据绑定/MVVM更容易正确。)
public class TaskClass
    {

        WebServiceClass webService = new WebServiceClass();

        List<SubTaskClass> subTasks = new List<SubTaskClass>();

        public int taskcategoryid { get; set; }
        public string type { get; set; }
        public string name { get; set; }
        public string icon { get; set; }
        public int sortOrder { get; set; }
        public string textColor
        {
            get
            {
                if (name == "Addition")
                {
                    return "#02cc9d";
                }
                else if (name == "Subtraction")
                {
                    return "black";
                }
                else if (name == "Divison")
                {
                    return "#fa5156";
                }
                else
                {
                    return "#23a0b6";
                }
            }
        }
        public List<SubTaskClass> subCategories
        {
            get
            {
                GetSubTasks(taskcategoryid);

                return subTasks;
            }
        }

        public async void GetSubTasks(int taskcategory)
        {
            subTasks = await webService.GetMathSubTasks(taskcategory);
        }
    }
public class SubTaskClass
    {
        public int id { get; set; }
        public int taskcategory { get; set; }
        public string name { get; set; }
    }
 <CollectionView
        x:Name="MathList"
        ItemsSource="{Binding catgories}"
        SelectedItem="{Binding selecteditem}"
        SelectionMode="Single">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <xct:Expander Command="{Binding command1}">
                    <xct:Expander.Header>
                        <Frame
                            Margin="10"
                            Padding="10"
                            BorderColor="LightGray"
                            HasShadow="False"
                            VerticalOptions="CenterAndExpand">
                            <StackLayout Orientation="Horizontal">
                                <Image
                                    HeightRequest="25"
                                    Source="{Binding icon}"
                                    WidthRequest="25" />
                                <Label
                                    FontAttributes="Bold"
                                    FontSize="Large"
                                    HeightRequest="35"
                                    Text="{Binding name}"
                                    TextColor="{Binding textColor}"
                                    VerticalOptions="CenterAndExpand" />
                            </StackLayout>
                        </Frame>
                    </xct:Expander.Header>
                    <Grid Padding="10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <ListView x:Name="SubCatgories" ItemsSource="{Binding subtasks}">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell>


                                        <StackLayout>
                                            <Frame
                                                Margin="10"
                                                Padding="10"
                                                BorderColor="LightGray"
                                                HasShadow="False"
                                                VerticalOptions="CenterAndExpand">
                                                <StackLayout Orientation="Horizontal">
                                                    <Label
                                                        FontAttributes="Bold"
                                                        HeightRequest="35"
                                                        Text="{Binding name}"
                                                        VerticalOptions="CenterAndExpand" />
                                                </StackLayout>
                                            </Frame>
                                        </StackLayout>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </Grid>
                </xct:Expander>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>

  public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new SubCatgories();
    }
}
public class SubCatgories : INotifyPropertyChanged
{
    public ObservableCollection<TaskClass> catgories { get; set; }
    public ICommand command1 { get; set; }
    private TaskClass _selecteditem;
    public TaskClass selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");
        }
    }

    public SubCatgories()
    {
        catgories = new ObservableCollection<TaskClass>()
        {
            new TaskClass(){icon="favorite.png",name="catgory 1",textColor=Color.Black,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
             new TaskClass(){icon="check.png",name="catgory 2",textColor=Color.Blue,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
              new TaskClass(){icon="delete.png",name="catgory 3",textColor=Color.YellowGreen,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
               new TaskClass(){icon="flag.png",name="catgory 4",textColor=Color.ForestGreen,subtasks=new ObservableCollection<SubTaskClass>(){
            new SubTaskClass(){name="sub class 1"}, new SubTaskClass(){name="sub class 2"}, new SubTaskClass(){name="sub class 3"}
            } },
        };

        selecteditem = catgories[0];
        command1 = new Command(() => { Console.WriteLine(selecteditem.name); });
    }
  
    public event PropertyChangedEventHandler PropertyChanged;    
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class TaskClass
{
    public string icon { get; set; }
    public string name { get; set; }
    public Color textColor { get; set; }

    public ObservableCollection<SubTaskClass> subtasks { get; set; }
}

public class SubTaskClass
{
    public int id { get; set; }
    public int taskcategory { get; set; }
    public string name { get; set; }
}