将视图模型属性绑定到自定义视图中的属性

问题描述 投票:0回答:4

我创建了一个具有步骤属性的自定义视图(NavProgressbar)。

    private static readonly BindableProperty ProgressStepProperty = BindableProperty.Create(
        nameof(ProgressStep), typeof(int), typeof(NavProgressbar),
        0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);

    private static void ProgressStepPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
            //update view, removed for brevity
    }

    public int ProgressStep
    {
        get => (int)GetValue(ProgressStepProperty);
        set => SetValue(ProgressStepProperty, value);
    }

在我的 MvxContentPage 中,我可以通过设置 ProgressStep 的值来使用它

    <npb:NavProgressbar
            x:Name="NavProgressBar"
            ProgressStep="2"/>

到目前为止,这有效。现在我想从我的视图模型中设置它,所以在我的视图模型中我创建了一个属性...

    private int _progressStep;
    public int ProgressStep
    {
        get => _progressStep;
        set => SetProperty(ref _progressStep, value);
    }

...在我的 MvxContentPage 中,我通过执行以下操作绑定到我的 viewmodel 属性,而不是固定值:

<npb:NavProgressbar x:Name="NavProgressBar" ProgressStep="{Binding ProgressStep}"/>
但这不起作用。按钮和标签等的其他绑定工作正常。
我的错误在哪里?

编辑:在我的 MvxContentPage 中,我设置了 NavProgressbar

xmlns:viewModels="clr-namespace:x.y.z.ViewModels;assembly=myAssembly" x:TypeArguments="viewModels:myViewModel" x:DataType="viewModels:myViewModel"
Resharper 在绑定中显示

ProgressStep="{Binding path={myViewModel}.ProgressStep}"
所以我认为绑定上下文设置正确。
也许视图和视图模型是抽象的并且我正在使用这个抽象视图和视图模型的子类也很重要?

其他绑定按预期工作,例如对于 Resharper 显示的按钮

<Button Text="{Binding path={myViewModel}.ButtonText}"
    
xaml xamarin.forms data-binding viewmodel
4个回答
0
投票
您需要将 BindingContext 设置为指向 ViewModel。

当使用

{Binding _____}

 连接 C# 属性时,XAML 需要知道它绑定到什么。默认情况下,它将绑定到与其关联的代码隐藏文件。以下内容可能适合您(仔细检查命名空间是否正确):

<npb:NavProgressbar x:Name="NavProgressBar" ProgressStep="{Binding ProgressStep}" <npb:NavProgressbar.BindingContext> <npb:NavProgressBarViewModel /> </npb:NavProgressbar.BindingContext> />
Microsoft 的此页面提供了一些关于 BindingContext 如何工作的好示例:

https://learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm


0
投票
根据您提供的代码,一切正确。因此,如果您确保该属性将调用视图模型中的属性更改事件,您可以检查类似的案例,其中有一个示例演示如何将自定义视图中的可绑定属性绑定到视图模型。

案例链接:

获取控件中ViewModel中使用的BindableProperty的值?


0
投票
所以,问题是 Resharper 建议将这个财产设为私有

private static readonly BindableProperty ProgressStepProperty = BindableProperty.Create(nameof(ProgressStep), typeof(int), typeof(NavProgressbar), 0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);
我做到了,但它必须是公开的

public static readonly BindableProperty ProgressStepProperty = BindableProperty.Create(nameof(ProgressStep), typeof(int), typeof(NavProgressbar), 0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);
    

0
投票
我遇到了类似的问题,但就我而言,我收到了此错误。

找不到“ValueTitle”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。

这是我在海关监管内的可绑定财产。

public readonly BindableProperty TitleValueProperty = BindableProperty.Create( nameof(TitleValue), typeof(string), typeof(FlexBetweenView), string.Empty, propertyChanged: (bindable, oldvalue, newvalue) => { var cntrl = (FlexBetweenView)bindable; cntrl.valueLbl.Text = newvalue as string; }); public string TitleValue { get => GetValue(TitleValueProperty).ToString(); set => SetValue(TitleValueProperty, value); }
这是我的视图模型

[QueryProperty(nameof(BookDetails), nameof(BookDetails))] public partial class BookDetailViewModel : ObservableObject { [ObservableProperty] public BookDetailModel bookDetails; }
我在这个页面中使用flex Betweenview 

<ContentPage.BindingContext> <vm:BookDetailViewModel /> </ContentPage.BindingContext> <ScrollView> <VerticalStackLayout> <Label Text="{Binding BookDetails.title}" /> <controls:FlexBetweenView Title="Name" TitleValue="{Binding BookDetails.title}"> </controls:FlexBetweenView> </VerticalStackLayout> </ScrollView>
使用像这样的硬编码字符串

<controls:FlexBetweenView Title="Name" TitleValue="Random Title">

工作正常

when i build and run with hardcoded string and letter try to bind in run time, it shows this

请你们帮帮我吧

© www.soinside.com 2019 - 2024. All rights reserved.