在ViewModel Xamarin上找不到命令属性?

时间:2019-01-04 16:02:49

标签: c# xamarin mvvm xamarin.forms command

尽管我尝试实现一个简单的命令,以通过在视图模型中触发此页面的命令来提高listview中进度条的属性。我不知道下一步该怎么做,因为当我从imagebutton调用命令到同一对象时,进度条不会增加?

点击图像按钮后输出

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

模型从可观察对象继承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>

代码表后面的男女同校页面

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

    }

我可以要求我解释一下我的错误吗?谢谢

1 个答案:

答案 0 :(得分:1)

您的代码和错误消息不一致。我将假定在此错误中:

  

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

SampleObject现在被命名为SampleModel

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

要想达到其他目的,您必须使用参考。首先,为您的ListView命名,例如:<ListView x:Name="MyListView" ...>

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

通过添加源并引用ListView,我们现在将绑定范围限制为在Path中指定的内容。因此,我们突然可以访问ListView的属性并访问其BindingContext(即SampleModel),并且在该上下文内访问我们要执行的命令,在这种情况下为{{1} }。

这有意义吗?