gpt4 book ai didi

Xamarin 表单从可绑定(bind)属性更新 View 模型字段

转载 作者:行者123 更新时间:2023-12-05 07:18:36 25 4
gpt4 key购买 nike

我觉得我遗漏了一些非常明显的东西。我有一个自定义控件,它有一个 View 模型,里面有一堆字段,但对于这个例子来说重要的是一个文本值。我可以使用自定义控件 XAML 中的以下内容非常轻松地绑定(bind)到它。

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

我想将其公开给任何调用此自定义控件的对象。据我所知,这需要使用可绑定(bind)属性

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

哪个有效。问题是当我已经有了 View 的 View 模型但看不到从可绑定(bind)属性到 View 模型字段的任何方式时,我不想绑定(bind)到 View 代码中的某些内容。

我最初尝试使用可绑定(bind)属性的属性更改事件,但是这必须是静态的,因此它无法访问控件 View 模型/绑定(bind)上下文。我尝试在文本字段上使用该集合,但这些似乎并没有真正被调用。这些都不起作用,而且在代码后面有一个文本字段纯粹是为了更新 View 模型中的一个字段似乎效率很低

编辑:只是为了进一步解释,我有一个带有 View 模型的页面

我有一个将 xaml 绑定(bind)到 View 模型的自定义控件

自定义控件是这样用在页面上的

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

目前,这会将自定义控件代码中的文本依赖属性和支持字段正确地设置为页面 View 模型 ControlText 是什么。

相反,我希望它在自定义控件 View 模型上设置文本字段并触发 View 模型属性更改事件。

所以基本上它会转到 PageVM.ControlText --> CustomControlVM.Text

最佳答案

我制作了一个具有可绑定(bind)属性的自定义控件。如果要对 BindableProperty 更改执行操作,则需要附加到其属性更改事件之一。您错过了代码中的 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>

可绑定(bind)属性:

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

View 模型:

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

我对自定义控件的使用:请不要忘记添加local的引用。

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

绑定(bind):

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

结果: enter image description here

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

关于Xamarin 表单从可绑定(bind)属性更新 View 模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58238405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com