使用Xamarin Forms如何从可绑定属性更新ViewModel字段?

3

我感觉自己漏掉了非常明显的东西。我有一个带有视图模型的自定义控件,其中包含许多字段,但这个示例中最重要的是文本值。我可以在自定义控件的XAML中很容易地使用以下内容进行绑定。

<Label Text="{Binding Text}" />

我希望让任何调用此自定义控件的内容都可以使用它。据我所知,这需要使用可绑定属性。

public static readonly BindableProperty TextProperty = BindableProperty.Create(propertyName: nameof(Text)
                                                               , returnType: typeof(string)
                                                               , declaringType: typeof(CustomControl));
public string Text
{
    get
    {
        return GetValue(TextProperty).ToString();
    }
    set
    {
        SetValue(TextProperty, value);
    }
}

这可以实现。问题是,我不想在视图代码后端绑定到某个东西,因为我已经为该视图拥有一个视图模型,但是我无法找到从可绑定属性到视图模型字段的方法。
起初,我尝试使用可绑定属性的属性更改事件,但是这必须是静态的,因此无法访问控件的视图模型/绑定上下文。我尝试使用Text字段上的set,但这些似乎没有被调用。这两种方法都不起作用,似乎将在代码后面纯粹地更新视图模型中的字段中具有文本字段效率不高。
编辑:进一步解释一下, 我有一个带有视图模型的页面
我有一个自定义控件,其xaml绑定到视图模型
自定义控件在页面上使用如下:
<ctrl:CustomControl Text="{Binding ControlText}"/>

目前,这将正确设置自定义控件代码后台中的Text依赖属性和后备字段,以反映页面视图模型ControlText的内容。

相反,我想要将其设置为自定义控件视图模型上的Text字段,并触发视图模型的属性更改事件。

因此,基本上它会变成PageVM.ControlText --> CustomControlVM.Text


你的问题涉及到多少实体并不清楚。根据你的描述,你有一个自定义控件(只有cs文件没有额外的xaml文件)。现在你又有了一个xaml视图和对应的视图模型,在这个视图中,你想要使用你的自定义控件,并将其中一个可绑定属性绑定到视图模型中的一个属性上? - Mouse On Mars
我不完全确定我理解你的问题,但我认为你可能正在寻找的是双向数据绑定(https://learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-binding-basics)。将你的xaml更改为:<Label Text="{Binding Text, Mode=TwoWay}" />。 - akseli
抱歉如果我解释得不好,我已经添加了一个编辑,希望能更清楚地说明我想要实现的目标。 - wolfman1001
1个回答

1

我创建了一个带有可绑定属性的自定义控件。如果您想在可绑定属性更改时执行操作,需要附加到其属性更改事件之一。您在代码中遗漏了PropertyChanged事件。

我的自定义控件:

<StackLayout>
        <Label x:Name="Title" BackgroundColor="Red" TextColor="White" HeightRequest="60" Text="A"/>
        <Label BackgroundColor="Green" TextColor="Black" HeightRequest="60" Text="B"></Label>
    </StackLayout>

BindableProperty:

private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            _text = value;
            OnPropertyChanged();
        }
    }
    public static readonly BindableProperty TextProperty = BindableProperty.Create(
             nameof(Text),
             typeof(string),
             typeof(MyCustomControl),
             string.Empty,
             propertyChanged: (bindable, oldValue, newValue) =>
             {
                 var control = bindable as MyCustomControl;
                 //var changingFrom = oldValue as string;
                 //var changingTo = newValue as string;
                 control.Title.Text = newValue.ToString(); //Title is the name of the label which I want to change the Text.
             });

视图模型:

public class ViewModel
{
    public string Text { get; set; }
}

我使用自定义控件:请不要忘记添加本地引用。

<local1:MyCustomControl Text="{Binding Text}"></local1:MyCustomControl>

绑定:

ViewModel viewModel = new ViewModel();
        viewModel.Text = "hello, ";
        this.BindingContext = viewModel;

结果: 输入图像描述

您可以从GitHub上的MyCustomControl文件夹中下载源文件供参考。 https://github.com/WendyZang/Test.git


链接无法使用,请您分享适当的链接。 - AkhilGite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接