.NET MAUI绑定问题

szqfcxe2  于 2023-01-18  发布在  .NET
关注(0)|答案(1)|浏览(182)

NET MAUI和MVVM的新手。我已经看到了其他的例子,但我的不起作用。当我运行代码时,它显示PlayMCanvas中的字符串PlayProperty为空。我不知道如何将数据导入画布。
虚拟机

public class ShowViewModel
{
    public string TheString {get;set; }
    public ShowViewModel()
    {
        TheString = "test";
    }
}

查看隐藏代码

public partial class ShowPlay : ContentPage
{
    public ShowViewModel TheVM;
    public ShowPlay()
    {
        InitializeComponent();

        TheVM = new ShowViewModel();

        TheVM.TheString = "test2";
        
        BindingContext = TheVM;
    }
}

XAML视图

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:drawables="clr-namespace:PlayMApp.Drawables"
             xmlns:local="clr-namespace:PlayMApp"
             x:Class="PlayMApp.ShowPlay"
             x:DataType="local:ShowViewModel"        
             Title="Show Play">

    <VerticalStackLayout>
        <Label 
            Text="Welcome to .NET MAUI!"
            VerticalOptions="Center" 
            HorizontalOptions="Center" />
        
        <Button 
            Text="Add Motion"
            Clicked="AddMotion" 
            VerticalOptions="Start"
            HorizontalOptions="Center"></Button>
        
        <GraphicsView HeightRequest="300"
              WidthRequest="400">
            <GraphicsView.Drawable>
                <drawables:PlayMCanvas Play="{ Binding TheString }" />
            </GraphicsView.Drawable>
        </GraphicsView>
    </VerticalStackLayout>
</ContentPage>

PlayMCanvas游戏

public class PlayMCanvas : GraphicsView, IDrawable
{
    public PlayMCanvas()
    {
    }

    public string Play
    {
        get  => (string)GetValue(PlayProperty);
        set => SetValue(PlayProperty, value);
    }

    public static BindableProperty PlayProperty = BindableProperty.Create(nameof(Play), typeof(string), typeof(PlayMCanvas));

    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
        canvas.StrokeColor = Colors.Red;
        canvas.StrokeSize = 6;
        canvas.DrawLine(10, 10, 90, 100); 
        canvas.DrawString(Play,40,30,HorizontalAlignment.Left);
    }
}

当我到达最后一行(DrawString)时,我认为Play应该是“test2”,但它为空
我已经尝试过修改代码来调整发送的内容。如果我通过<drawables:PlayMCanvas Play="test" />只发送一个纯文本字符串,它可以工作,但不能使用绑定

vi4fp9gy

vi4fp9gy1#

我想通了,看到了另一个例子,有人在他们绑定的组件中非常具体,并遵循了这一点。
x:Name添加到PlayMCanvas,如下所示:

<drawables:PlayMCanvas x:Name="PlayMCan" Play="{Binding TheString}" />

在代码隐藏中更改为:

PlayMCan.BindingContext = TheVM;

而且现在绑定似乎起作用了。
感谢您的评论!

相关问题