XAML .NET MAUI -如何绑定到ObservableCollection项的属性

lg40wkob  于 2022-12-25  发布在  .NET
关注(0)|答案(2)|浏览(233)

我有一个CollectionView,我想将标签的文本绑定到“RecipeName '。
这是行不通的:Text="{绑定配方名称}”
现在它看起来像:

我的视图如下所示:

<CollectionView ItemsSource="{Binding Recipes}"
                SelectionMode="None">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="{x:Type x:String}">
            <SwipeView>
                <Grid>
                    <Frame>
                        <Frame.GestureRecognizers>
                            <TapGestureRecognizer 
                                   Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:MainViewModel}}, Path=TapCommand}"
                                   CommandParameter="{Binding .}"/>
                        </Frame.GestureRecognizers>
                        <Label Text="{Binding .}" <!-- Here -->
                               FontSize="24"/>
                    </Frame>
                </Grid>
            </SwipeView>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

我的ViewModel看起来像:

public MainViewModel()
{
    LoadRecipes();
}

private void LoadRecipes()
{
    Recipes = new ObservableCollection<RecipeModel>
    {
        new RecipeModel
        {
            RecipeName = "Pizza", // Here
            Ingredients = "Teig, Belag",
            Steps = "Belag auf Teig und danach in den Ofen"
        },
        new RecipeModel
        {
            RecipeName = "Burger", // Here
            Ingredients = "Brötchen, Fleisch, Belag",
            Steps = "Belag und Fleisch auf das Brötchen"
        }
    };
}

[ObservableProperty]
ObservableCollection<RecipeModel> recipes;
yuvru6vn

yuvru6vn1#

这将绑定整个对象

Text="{Binding .}"

绑定特定属性

Text="{Binding RecipeName}"

请注意,您只能绑定到公共属性

neskvpey

neskvpey2#

不需要设置文本的BindingContext,这看起来有点复杂,我给予你一些建议,让绑定的使用更加清晰,适合你的情况。
首先设置内容页的BindingContext,设置为MainViewModel,可以在.xaml文件中设置:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         .....
         xmlns:viewmodel="clr-namespace:BindBindBind">

    <ContentPage.BindingContext>
        <viewmodel:MainViewModel/>
    </ContentPage.BindingContext>

或在.cs文件后的代码中:

public MainPage()
{
    InitializeComponent();
    this.BindingContext = new MainViewModel();
}

然后对于CollectionView,将ItemsSource绑定到MainViewModel中的配方。默认的BindingContext与其父级相同,即之前设置的MainViewModel

<CollectionView ItemsSource="{Binding Recipes}"
        SelectionMode="None">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <SwipeView>
                <Grid>
                    <Frame>
                        <Frame.GestureRecognizers>
                            <TapGestureRecognizer 
                                   Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:MainViewModel}}, Path=TapCommand}"
                                   CommandParameter="{Binding .}"/>
                        </Frame.GestureRecognizers>
                        <Label Text="{Binding RecipeName}" FontSize="24"/>
                    </Frame>
                </Grid>
            </SwipeView>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

DataTemplate的x:DataType不是必需的。Recipes是RecipeModel示例的集合,DataTemplate定义每个示例的显示方式。因此,对于每个标签,Text属性应绑定到每个模型示例的RecipeName属性。

希望对你有用。如果你还有什么问题,尽管问。
有关详细信息,请参阅Populate a CollectionView with dataData binding

相关问题