【问题标题】:Commanding property not found on viewmodel xamarin?在 viewmodel xamarin 上找不到命令属性?
【发布时间】:2019-05-31 05:28:10
【问题描述】:

虽然我尝试实现一个简单的命令,通过在视图模型中触发的命令来提升列表视图中进度条的属性,但该命令会发送到此页面。我不知道下一步该做什么,因为当我从 imagebutton assing 到同一个对象调用命令时,进度条不会增加?

点击图片按钮后的输出

Bidning: 'IncrementCommand property not found on AppDemo.Models.SampleObject, target property XamarinForms.ImageButtonCommand'

来自 Viewmodel 的代码:

    public ICommand IncrementCommand { get; }
    public MainViewModel(IPageServices pageServices)
    {
        this._pageServices = pageServices; 

        Wastes = GetObjects();
        IncrementCommand = new Command(async () => await IncrementObject());

    }
    async Task IncrementObject()
    {
        await objectServices.IncrementObject(object);
        OnPropertyChanged("SampleCounter");
    }

调用Task的服务代码

    public Task IncrementObject(ObjectModel object)
    {
        object.ObjectCounter += .1;
        return objectRepository.Save(object);
    }

模型从 Observable 对象继承 INotifyPropertyChanged

public class SampleModel: ObservableObject
{
    public int? Id { get; set; }
    public string SampleIcon{ get; set; }
    public double SampleCounter{ get; set; } 
}

MainPage xaml 文件中的代码

<ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="3*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <ProgressBar x:Name="progressBar"
                                    Grid.RowSpan="2" Grid.Row="0" Grid.Column="0"
                                     BackgroundColor="Transparent"
                                     ProgressColor="#614c96"
                                     Progress="{Binding ObjectCounter}"                                         
                                     />
                        <ImageButton x:Name="iconButton"
                                     Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" 
                                     WidthRequest="100"
                                     HeightRequest="100"
                                     Aspect="AspectFit"
                                     BackgroundColor="Transparent"
                                     Source="{Binding ObjectIcon}"
                                     Command="{x:Binding IncrementCommand}">
                        </ImageButton>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>

Coede 表单页面代码隐藏

    public MainPage()
    {
        InitializeComponent();
        var pageServices = new PageServices();
        BindingContext = new MainViewModel(pageServices);

    }

我能解释一下我的错误吗?谢谢你

【问题讨论】:

  • ListView 中每个项目的 BindingContext 是 SampleModel,而不是 ViewModel

标签: c# xamarin mvvm xamarin.forms command


【解决方案1】:

你的代码和错误信息不一致。我将假设在此错误中:

Bidning: '在 AppDemo.Models.SampleObject 上找不到 IncrementCommand 属性,目标属性 XamarinForms.ImageButtonCommand'

SampleObject 现在被命名为 SampleModel。

就像 Jason 在评论中指出的那样,列表中每个项目的绑定上下文与整个页面的绑定上下文不同。每当您使用列表时,每个项目的绑定上下文都将作用于该单元格中的项目。

为了能够达到此之外的内容,您必须使用参考。首先,为您的ListView 命名,如下所示:&lt;ListView x:Name="MyListView" ...&gt;。

然后,对于您的ImageButton,将Command 更改为:&lt;ImageButton Command="{Binding Source={x:Reference MyListView}, Path=BindingContext.IncrementCommand}"&gt;

通过添加源并引用ListView,我们现在将绑定范围限定为我们在Path 中指定的任何内容。因此,我们突然可以访问ListView 的属性并访问它的BindingContext(即SampleModel)并在该上下文中访问我们所追求的命令,在本例中为IncrementCommand。

这有意义吗?

【讨论】:

  • 谢谢你,我真的很感谢你的回答。但它出现了关于单击图像按钮后引用的对象的未处理异常:(
  • 命令中的代码是什么?确切的异常消息是什么?
  • 命令调用 IncrementObject 任务,后者调用服务任务 InceremntObject。我发布的带有此问题的代码显示它
  • 你设置断点了吗?我的猜测是 object 现在为空。将您的 ImageButton 更改为:&lt;ImageButton Command="{Binding Source={x:Reference MyListView}, Path=BindingContext.IncrementCommand}" CommandParameter="{Binding .}"&gt;。通过添加CommandParameter,您可以指定作为命令参数提供的内容。因此,您的 object 参数的值。 {Binding .} 表示您希望提供绑定到单元格的整个对象作为参数。
  • 按照您的解释进行命令效果很好,但我的代码在某处丢失了一些东西,因为我在单击此按钮后尝试使用 DisplayAlert Dialog 并按预期工作:) 非常感谢您的时间
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2019-08-08
相关资源
最近更新 更多