Xamarin表单从可绑定属性中更新视图模型字段

时间:2019-10-04 14:32:33

标签: xamarin xamarin.forms

我觉得我缺少一些显而易见的东西。我有一个自定义控件,该控件具有一个视图模型,其中包含一堆字段,但此示例中的一个重要控件是文本值。我可以使用自定义控件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);
    }
}

哪个工作。问题是当我已经有一个视图模型时,我不想绑定到后面的视图代码中,但是看不到从可绑定属性到视图模型字段的任何方式。

我首先尝试使用bindable属性的属性更改事件,但是它必须是静态的,因此它无法访问控件视图模型/绑定上下文。我尝试在“文本”字段上使用该设置,但实际上似乎未真正调用它们。这些都不起作用,并且在代码后边仅具有文本字段来纯粹更新视图模型中的字段似乎效率很低

修改:只是为了尝试进一步说明, 我有一个带有Viewmodel的页面

我有一个自定义控件,该控件具有绑定到视图模型的xaml

自定义控件像这样在页面上使用

<ctrl:CustomControl Text="{Binding ControlText}"/>

当前,这将把自定义控件代码中的Text依赖项属性和后备字段正确地设置为Pages ViewModel ControlText是什么。

相反,我希望此方法在“自定义控件”视图模型上设置“文本”字段并触发viewmodels属性更改事件。

因此基本上它将是PageVM.ControlText-> CustomControlVM.Text

1 个答案:

答案 0 :(得分:0)

我制作了一个具有可绑定属性的自定义控件。如果要对BindableProperty更改执行操作,则需要附加到其属性更改事件之一。您会错过代码中的PropertyChanged事件。

MyCustomControl:

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

可绑定属性:

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.
             });

ViewModel:

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;

结果: enter image description here

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