【问题标题】:List View on binding context change empties the button text绑定上下文更改的列表视图清空按钮文本
【发布时间】:2018-09-18 16:32:11
【问题描述】:

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

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

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

现在添加后,点击事件可以正常工作,但文本绑定不起作用列表视图代码如下:

<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)
{}

【问题讨论】:

    标签: xamarin xamarin.forms freshmvvm


    【解决方案1】:

    正确的想法,糟糕的执行。

    这里发生的情况是您更改了按钮的BindingContext,现在它不再能够“看到”项目的ActivityAmount 属性,因为它正在“寻找”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 .}"/> 
    

    【讨论】:

    • 无论如何,一个小时前解决了,感谢您的回答,这是正确的,您只是节省了我自己回答问题的时间,谢谢,深夜代码可能很愚蠢
    • 哈哈,我完全同意你的看法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多