XAML 如何在.net maui中将变量传递给子级?

tuwxkamq  于 2023-09-28  发布在  .NET
关注(0)|答案(2)|浏览(122)

我正在尝试创建某种可重用消息组件,它显示info/warning/err/ok消息。
所以在我的内容页面就像
<views:MessageView />
但是我需要从父视图传递 prop 到这个视图
喜欢消息的文本&类型,以便开发人员可以选择要显示的内容
我也想使用MVVM,但如果这是问题,我可以使用代码隐藏
我能想象出这样的事吗?
<views:MessageView MessageText={Binding ErrMsg} MessageType={Binding Type} />
可以在.net毛伊岛吗?

mccptt67

mccptt671#

没问题首先。不要在控件中使用BindingContext。控件依赖于它当前附着到的视图。
要与控件通信,可以阅读有关bindable-properties的信息
所以在你的控制下,它可以看起来像这样。

public static readonly BindableProperty MessageTextProperty =
    BindableProperty.Create(nameof(MessageText), typeof(string), typeof(MyControl));

public string MessageText
{
    get => (string)GetValue(MessageTextProperty);
    set => SetValue(MessageTextProperty, value);
}

因此,当您绑定到ViewModel时,它将获取数据并将其发送到您的控件。

更新

下面是更新标签的常用方法的完整代码。

public partial class MessageView : ContentView
{
    public static readonly BindableProperty MessageTextProperty =
            BindableProperty.Create(nameof(MessageText), typeof(string), typeof(MessageView), defaultValue: default(string), propertyChanged: OnTextChanged);

    private static void OnTextChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var messageView = (MessageView)bindable;
        messageView.MyLabel.Text = (string)newValue;
    }

    public string MessageText
    {
        get => (string)GetValue(MessageTextProperty);
        set => SetValue(MessageTextProperty, value);
    }

    public MessageView()
    {
        InitializeComponent();
    }
}

在您的视图中,您可以像这样使用控件:

<controls:MessageView MessageText="{Binding MyMessage}" />

使用ViewModel中的绑定

[ObservableProperty]
private string myMessage = "Hello everybody!";
avkwfej4

avkwfej42#

我能想象出这样的事吗?
<views:MessageView MessageText={Binding ErrMsg} MessageType={Binding Type} />
可以在.net毛伊岛吗?
是的,更具体地说,你可以使用ContentView来实现它。
你可以参考我之前发布的答案:Binding Custom ListView Control

相关问题