尽管我尝试实现一个简单的命令,以通过在视图模型中触发此页面的命令来提高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);
}
我可以要求我解释一下我的错误吗?谢谢
答案 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} }。
这有意义吗?