【发布时间】:2022-06-22 03:47:40
【问题描述】:
我正在使用 .NET Maui 使用 MVVM 开发一个 Windows 桌面应用程序。
我有 2 个 Pickers ImageSource 和 SelectedIndex 绑定到视图模型中的属性。当从第一个Picker 中选择一个项目时,需要更改另一个项目中的项目。我想将SelectedIndexChanged 事件绑定到视图模型中的一个方法来完成此操作。
选择器 Picker 中事件的 XAML 如下所示:
<Picker SelectedIndexChanged="{Binding OnSelectedIndexChanged}" />
viewmodel 中的方法如下所示:
public void OnSelectedIndexChanged(object sender, EventArgs e)
{
// do stuff
}
但运行程序时出现以下错误:
XFC0009 未找到“SelectedIndexChanged”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。 MauiApp1
我的临时解决方案是在事件触发时从后面的代码中调用 viewmodel 方法。后面的代码是这样的:
private void Picker_SelectedIndexChanged(object sender, EventArgs e)
{
(BindingContext as MainViewModel).OnSelectedIndexChanged(sender, e);
}
我想让后面的代码尽可能地笨拙。 有没有办法通过直接绑定到视图模型中的方法来处理SelectedIndexChanged 事件?
更新尝试实现partial void On<PropertyName>Changed()
我的视图模型:
public partial class MainViewModel : ObservableObject
{
[ObservableProperty]
private ObservableCollection<ProductGroupRoot> itemSourceProductGroups = new();
[ObservableProperty]
private int selectedProductGroup = -1;
[ObservableProperty]
private ObservableCollection<ProductRoot> itemSourceProducts = new();
[ObservableProperty]
private int selectedProduct = -1;
// other properties
partial void OnSelectedProductGroupChanged(int value)
{
// TODO: change values in ItemSourceProducts
}
}
自动生成的代码应该已经为部分方法创建了一个定义,但我得到了错误:
CS0759 未找到用于实现部分方法 'MainViewModel.OnSelectedProductGroupChanged(int)' 的声明的定义声明
我正在使用 CommunityToolkit.Mvvm v7.1.2(最新稳定版)。
更新 2 发布工作代码。
我的 csproj 文件:
<Project>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.0.0-preview4" />
</ItemGroup>
</Project>
我的选择器:
<Picker ItemsSource="{Binding ProductGroups, Mode=TwoWay}"
SelectedIndex="{Binding ProductGroupsIndex, Mode=TwoWay}" />
我的视图模型:
[ObservableProperty]
private ObservableCollection<ProductGroupRoot> productGroups = new();
[ObservableProperty]
private int productGroupsIndex = -1;
partial void OnProductGroupsIndexChanged(int value) {}
【问题讨论】:
-
我不确定是否可以绑定事件。你使用的方法更干净,绑定
SelectedIndex。当绑定到SelectedIndex的属性发生变化时,您可以简单地更改第二个选择器项。 -
你绑定的是命令,而不是事件。一目了然,文档并未表明 MAUI Picker 支持任何命令。您可以使用 EventToCommand 行为来解决这个问题,或者只是让代码中的事件处理程序调用相应的 VM 方法,或者按照@RiccardoMinato 的建议进行操作
-
感谢@RiccardoMinato 和@Jason,我想我会在
SelectedIndex更改时更改第二个选择器。我正在使用 MVVM CommunityToolkit,所以我必须找出正确的方法来做到这一点。应该是微不足道的。
标签: c# xaml mvvm data-binding maui