绑定上下文更改的列表视图清空按钮文本

List View on binding context change empties the button text

我已经面对这种奇怪的行为有一段时间了,我无法理解到底是什么导致了这个问题。

我正在使用 FreshMvvm,我有一个 ListView,里面有两个按钮。

现在的问题是其中一个按钮从绑定中获取文本,其次要为按钮分配单击命令我必须遵循

现在添加这个后,点击事件完美运行,但文本绑定不起作用我怀疑这是因为绑定上下文更改,我确信这是全部原因,但我无法找到修复方法我的列表视图代码如下:

<ListView Grid.Row="1" 
          ItemsSource="{Binding CategoryAndActivities}" 
          x:Name="WishListName"
          HorizontalOptions="FillAndExpand" 
          VerticalOptions="FillAndExpand" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>                                        
                    <Frame>
                        <Grid VerticalOptions="FillAndExpand" 
                              HorizontalOptions="FillAndExpand">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <!--Image and Title-->
                            <AbsoluteLayout Grid.Row="0"
                                            HeightRequest="70" 
                                            IsClippedToBounds = "true">
                                <ffimageloading:CachedImage Source="{Binding ActivityImage}" 
                                                            Aspect="AspectFill" 
                                                            AbsoluteLayout.LayoutFlags="All"
                                                            AbsoluteLayout.LayoutBounds="0.0, 0.0, 0.3, 0.85" 
                                                            Margin="5, 0, 5, 5" 
                                                            ErrorPlaceholder="nopreviewlandscape" 
                                                            LoadingPlaceholder="loadingicon"/>
                                <Label x:Name="ActivityNameLabel" 
                                       Text="{Binding ActivityName}" 
                                       FontAttributes="Bold" 
                                       VerticalTextAlignment="Start"
                                       TextColor="{StaticResource price_text_color}" 
                                       FontSize="Small"
                                       AbsoluteLayout.LayoutFlags="All"
                                       AbsoluteLayout.LayoutBounds="1.0, 0.0, 0.7, 0.85" 
                                       Margin="5, 5, 5, 5">
                                </Label>
                            </AbsoluteLayout>
                            <!--Descp-->
                            <StackLayout Grid.Row = "1" 
                                         IsClippedToBounds="true">
                                <Label Text="{Binding AcitivityDescription}" 
                                       FontSize="Small" 
                                       LineBreakMode="WordWrap" 
                                       Margin="5, 0, 5, 5"/>
                            </StackLayout>
                            <Grid BackgroundColor="White" 
                                  Grid.Row = "2" 
                                  VerticalOptions="FillAndExpand" 
                                  HorizontalOptions="FillAndExpand">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="50*"/>
                                    <ColumnDefinition Width="50*"/>
                                </Grid.ColumnDefinitions>

                                <Button BackgroundColor="{StaticResource ColorBrandingYellow}"  
                                        HorizontalOptions="FillAndExpand"  
                                        Command="{Binding AddToWishListCommand}" 
                                        Grid.Column="0" 
                                        BindingContext="{Binding Source={x:Reference ListName}, Path=BindingContext}" 
                                        CommandParameter="{Binding Source={x:Reference ActivityNameLabel},Path=BindingContext}" 
                                        TextColor="Black" 
                                        Text="{resourceLocal:Translate addToWishlist}" 
                                        FontSize = "Small" />
                                <Button BackgroundColor="{StaticResource ColorBrandingYellow}" 
                                        HorizontalOptions="FillAndExpand" 
                                        Grid.Column="1" 
                                        TextColor="Black" 
                                        Text="{Binding ActivityAmount}" 
                                        FontSize = "Small" 
                                        Command="{Binding GoFeatureActivityDetail}" 
                                        BindingContext="{Binding Source={x:Reference ListName}, Path=BindingContext}"
                                        CommandParameter="{Binding Source={x:Reference ActivityNameLabel},Path=BindingContext}"/> 
                            </Grid>
                        </Grid>
                    </Frame>                                        
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

问题出在绑定为文本的按钮中,即使数据实际存在,文本也只是显示为空。

点击事件代码如下:

public ICommand GoFeatureActivityDetail { get; set; }

public BrowseFeaturesPageModel()
{
    AddToWishListCommand = new Command(WishListCommand);
    GoFeatureActivityDetail = new Command(FeatureActivityDetailCommand);
}

private async void FeatureActivityDetailCommand(object obj)
{}

思路对,执行不好。

这里发生的事情是您更改了按钮的 BindingContext,现在它不再能够 "see" 项目的 ActivityAmount 属性 因为它是 'looking' 到 BrowseFeaturesPageModel 对象。 您可以让事情变得更简单,仅在您将使用的地方更改 BindingContext,而不是整个 View(在本例中为按钮):

<Button BackgroundColor="{StaticResource ColorBrandingYellow}" 
        HorizontalOptions="FillAndExpand" 
        Grid.Column="1" 
        TextColor="Black" 
        Text="{Binding ActivityAmount}" 
        FontSize = "Small" 
        Command="{Binding BindingContext.GoFeatureActivityDetail, Source={x:Reference ListName}}" 
        CommandParameter="{Binding .}"/>