【问题标题】:.NET Maui MVVM Picker Binding SelectedIndexChanged Event.NET Maui MVVM 选择器绑定 SelectedIndexChanged 事件
【发布时间】:2022-06-22 03:47:40
【问题描述】:

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

我有 2 个 Pickers ImageSourceSelectedIndex 绑定到视图模型中的属性。当从第一个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&lt;PropertyName&gt;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


【解决方案1】:

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

由于您使用的是 MVVM CommunityToolkit,要在属性更改后执行一些代码,您必须实现在自动生成的类中定义的部分方法。 这个方法叫做On&lt;YourPropertyName&gt;Changed()

检查这个答案:https://stackoverflow.com/a/72499605/7977288

【讨论】:

  • 我将分部方法添加到视图模型并收到错误消息,“未找到用于实现分部方法的声明的定义声明...”。我会用我的代码更新我的问题。
  • 我是否需要 CommunityToolkit.Mvvm 预览版 8 才能使用此功能?
  • @JBest 没错,尝试使用最新的预览版
  • 谢谢,这行得通。我现在在视图模型中引用公共ObservableProperties 时收到模棱两可的警告,但我认为这超出了这个问题的范围。我会将其标记为正确答案。
  • @JBest 您能否显示您的代码,因为我遇到了从 ViewModel 获取选择器 SelectionIndexChanged 的​​相同问题。伙计,他们为什么不像其他视图一样只实现一个命令!
猜你喜欢
  • 2022-06-17
  • 2022-07-25
  • 2023-01-10
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多