2

很有可能我今天没有喝足够的咖啡,但在过去的几个小时里,我遇到了一个问题。

我创建了一个 CustomEntry 类,它只是一个包含 Entry 和其他一些位的 ContentView,并且我已经向这个类添加了一个新的 BindableProperty,它应该设置它的“Test”属性。

计划是通过这个 bindableproperty 从我的 ViewModel 传递一个字符串值,而不是仅仅硬编码这个值(例如)我想使用绑定从我的 ViewModel 传递一个值(例如 Test="{Binding AStringFromMyViewModel}") -出于某种原因,当我尝试使用绑定时,永远不会设置可绑定属性。

请注意,如果我对值进行硬编码,例如 Test="123",那么它可以正常工作,但如果我像下面所做的那样执行 Test="{Binding AStringFromMyViewModel}",则它不起作用。

这是我所拥有的:

页面 XML

<?xml version="1.0" encoding="UTF-8"?>
<pages:BasePage xmlns:pages="clr-namespace:ShoppingListNEW.Pages" NavigationPage.HasNavigationBar="True" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:helpers="clr-namespace:ShoppingListNEW.MarkupExtensions" xmlns:views="clr-namespace:ShoppingListNEW.Views" xmlns:yummy="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView" x:Class="ShoppingListNEW.Pages.SignUp">
    <StackLayout>
        <Label Margin="15,15,0,0" TextColor="#2b2c2e" Text="{helpers:TranslateExtension FirstName}"></Label>
        <views:CustomEntry Test="{Binding AStringFromMyViewModel, Mode=TwoWay}" BorderColor="Gray" HeightRequest="50" PlaceholderColor="Gray" Margin="15,0,15,0" BackgroundColor="Transparent" Text="{Binding FirstName}" TextColor="#232324" Placeholder="{helpers:TranslateExtension PleaseEnterYourFirstName}" AutomationId="txtFirstName" />
    </StackLayout>
</pages:BasePage>

页面支持

public partial class SignUp : BasePage
{
    public SignUp()
    {
        InitializeComponent();

        //Bind our UI to our ViewModel
        BindingContext = App.Locator.SignUpViewModel;
    }
}

查看模型

public class SignUpViewModel : ViewModelBase
{
    //I expect this value of "123" to be passed to my BindableProperty but it's not
    public string AStringFromMyViewModel {get; set; } = "123";

    public SignUpViewModel()
    {
    }
}

最后是我的新 CustomEntry 控件 - 我认为您不需要 XML,因为它只是 BindableProperty 不起作用。

public partial class CustomEntry : ContentView, INotifyPropertyChanged
{
    public static readonly BindableProperty TestProperty =
        BindableProperty.Create("Test", typeof(string), typeof(CustomEntry), null, BindingMode.OneWay, null);

    public string Test
    {
        get
        {
            return (string)GetValue(TestProperty);
        }
        set
        {
    //This is never called
            SetValue(TestProperty, value);
        }
    }

    public CustomEntry()
    {
        InitializeComponent();
        BindingContext = this;
    }

}

提前致谢。

4

2 回答 2

1

与往常一样,我在发布后 5 分钟设法修复它。

看起来问题是因为 CustomEntry 中的 BindingContext。移除它会将所有东西都带入生活,所以这就是我的下一步!

于 2020-02-13T18:24:55.680 回答
0

修改你ViewModel的实施INotifyPropertyChanged 和改变你的AStringFromMyViewModel {get; set; }成为

private string _aString;
public string AStringFromMyViewModel {
    get => _aString;
    set {
        _aString = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AStringFromMyViewModel)))
    }
}
于 2020-02-14T08:53:35.737 回答