XAML 如何绑定到ObservableCollection项的属性

rqmkfv5c  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(78)

我有一个CollectionView,我想将标签的文本绑定到“Recipename”。
无法执行:Text="{Binding RecipeName}”
现在看起来像:
x1c 0d1x的数据
我的视图看起来像:

<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 = "Rezept 1", // Here
            Ingredients = "Zutaten 1",
            Steps = "Schritte 1"
        },
        new RecipeModel
        {
            RecipeName = "Rezept 2", // Here
            Ingredients = "Zutaten 2",
            Steps = "Schritte 2"
        }
    };
}

[ObservableProperty]
ObservableCollection<RecipeModel> recipes;


编辑:非常感谢你的回答。我得到了我:Text="{Binding Source={RelativeSource AncestorType={x:Type model:RecipeModel}}, Path=RecipeName}"

zhte4eai

zhte4eai1#

这将绑定整个对象

Text="{Binding .}"

字符串
绑定特定属性

Text="{Binding RecipeName}"


注意,只能绑定公共属性

ego6inou

ego6inou2#

不需要设置Text的BindingContext,看起来有点复杂,我给予一些建议,让绑定的使用更加清晰。
首先设置ContentPage的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中的Recipes,默认的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>


x:DataTemplate的DataType不是必须的,Recipes是RecipeModel示例的Collection,DataTemplate定义了每个示例如何显示,所以对于每个标签,Text属性应该绑定到每个模型示例的RecipeName属性。
希望对你有用。如果你还有什么问题,尽管问。
有关更多信息,请参阅Populate a CollectionView with dataData binding

相关问题