.NET Maui MVVM Picker 绑定 SelectedIndexChanged 事件

jbd*_*dev 9 c# data-binding xaml mvvm maui

我正在使用 MVVM 开发一个带有 .NET Maui 的 Windows 桌面应用程序。

我有 2 个Pickers带有ImageSourceSelectedIndex绑定到视图模型中的属性。当从第一个项目中选择一个项目时, Picker需要更改另一个项目中的项目。我想将SelectedIndexChanged事件绑定到视图模型中的方法来完成此操作。

选择器中事件的 XAMLPicker如下所示:

<Picker SelectedIndexChanged="{Binding OnSelectedIndexChanged}" />
Run Code Online (Sandbox Code Playgroud)

视图模型中的方法如下所示:

public void OnSelectedIndexChanged(object sender, EventArgs e)
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

但运行程序时出现以下错误:

XFC0009 找不到“SelectedIndexChanged”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。毛伊岛App1

我的临时解决方案是在事件触发时从后面的代码中调用 viewmodel 方法。背后的代码如下所示:

private void Picker_SelectedIndexChanged(object sender, EventArgs e)
{
    (BindingContext as MainViewModel).OnSelectedIndexChanged(sender, e);
}
Run Code Online (Sandbox Code Playgroud)

我想让后面的代码尽可能简单。有没有办法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
    }        
}
Run Code Online (Sandbox Code Playgroud)

自动生成的代码应该为部分方法创建一个定义,但我收到错误:

CS0759 未找到用于实现部分方法“MainViewModel.OnSelectedProductGroupChanged(int)”声明的定义声明

我正在使用 CommunityToolkit.Mvvm v7.1.2(最新稳定版)。

更新 2 发布工作代码。

我的 csproj 文件:

<Project>
    <ItemGroup>
        <PackageReference Include="CommunityToolkit.Mvvm" Version="8.0.0-preview4" />
    </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

我的选择器:

<Picker ItemsSource="{Binding ProductGroups, Mode=TwoWay}" 
        SelectedIndex="{Binding ProductGroupsIndex, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)

我的视图模型:

[ObservableProperty]
private ObservableCollection<ProductGroupRoot> productGroups = new();

[ObservableProperty]
private int productGroupsIndex = -1;

partial void OnProductGroupsIndexChanged(int value) {}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ato 4

当绑定的属性发生SelectedIndex变化时,您可以简单地更改第二个选择器项目。

由于您使用的是 MVVM CommunityToolkit,因此要在属性更改后执行一些代码,您必须实现自动生成的类中定义的部分方法。这种方法称为On<YourPropertyName>Changed().

需要注意的是,该功能仅从 8.0.0 版本开始可用。

检查这个答案:/sf/answers/5074972381/

  • @JBest你能展示一下你的代码吗,因为我在从我的ViewModel获取选择器SelectionIndexChanged时遇到了同样的问题。天哪,他们为什么不像其他视图那样只实现一个命令! (3认同)