如何在MAUI中刷新XAML视图?

1rhkuytd  于 2022-12-31  发布在  其他
关注(0)|答案(2)|浏览(364)

我正在做一个应用程序,我有布局动态生成的基础上,一个名单。

<StackLayout>
        <CollectionView x:Name="taskList">
            <CollectionView.ItemTemplate>
                <DataTemplate x:DataType="models:Task">
                    <VerticalStackLayout Margin="15">
                        <Entry Text="{Binding name}" IsReadOnly="True" />
                        <Entry Text="{Binding departmentsString}" IsReadOnly="True"/>
                        <HorizontalStackLayout>
                            <Entry Text="{Binding status}" IsReadOnly="True"/>
                            <Entry Text="{Binding deadline}" IsReadOnly="True" />
                            <Entry Text="{Binding author.fullName}" IsReadOnly="True"/>
                        </HorizontalStackLayout>
                        <Entry Text="{Binding description}" IsReadOnly="True" />
                    </VerticalStackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

列表是这样绑定的:

taskList.ItemsSource = company.tasks;

每当向列表中添加新项目时,我都要刷新此列表。
我尝试将列表重新绑定到ItemsSource,但没有成功:

taskList.ItemsSource = company.tasks;

我该怎么做呢?我能刷新视图,让它再次生成所有内容吗?

f3temu5u

f3temu5u1#

您应该绑定一个自定义集合,而不是从代码隐藏中分配ItemsSource,这样做会更容易,并将UI和逻辑解耦。

  • (我这里没有IDE,所以没有测试)*

你可以这样做:

// data class
public class TaskInfo
{
    public string name {get; set;}
    public string departmentsString {get;set;}
}
// you page/view whatever code behind the xaml
public class YourPage : // insert the class which it is derived from.
{
   // create a collection property, which generates events when changed. The UI react on these events.
   public ObservableCollection<TaskInfo> Tasks {get;} = new();

   public YourPage()
   {
      InitComponentsOrSomething();
      // assign the datacontext (which the view binds to)
      this.DataContext = this;
   }
}

你的xaml应该是这样的:* (注意绑定而不是名称)*

<StackLayout>
    <CollectionView ItemsSource="{Binding Tasks}">
        <CollectionView.ItemTemplate>
            <DataTemplate x:DataType="models:Task">
                <VerticalStackLayout Margin="15">
                    <Entry Text="{Binding name}" IsReadOnly="True" />
                    <Entry Text="{Binding departmentsString}" IsReadOnly="True"/>
                    <HorizontalStackLayout>
                        <Entry Text="{Binding status}" IsReadOnly="True"/>
                        <Entry Text="{Binding deadline}" IsReadOnly="True" />
                        <Entry Text="{Binding author.fullName}" IsReadOnly="True"/>
                    </HorizontalStackLayout>
                    <Entry Text="{Binding description}" IsReadOnly="True" />
                </VerticalStackLayout>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</StackLayout>

如果要向集合中添加项,只需使用Tasks属性:

Tasks.Add(new TaskInfo { name = "some name", departmentsString = "Enter here" });

ps:我不会把一个数据对象叫做'Task',也不会给它一个更好的描述。TaskInfo/CompanyTask。

tquggr8v

tquggr8v2#

您应该使用IEnumerable集合来发送ItemsSource的属性更改通知(例如ObservableCollection),然后简单地添加到基础集合中。

ObservableCollection<string> tasks = new();
taskList.ItemsSource = tasks;
tasks.Add("Do something");

微软参考

相关问题