Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义控件中的Xamarin BindableProperty_C#_Xaml_Xamarin_Xamarin.forms - Fatal编程技术网

C# 自定义控件中的Xamarin BindableProperty

C# 自定义控件中的Xamarin BindableProperty,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我在自定义控件中使用可绑定属性,以便从xaml代码中设置属性。然而,我的属性似乎总是会得到我为bindable属性指定的默认值 我的xaml代码: <controls:MyView ID="4" /> 在本例中,我希望我的属性应该得到值4,但它总是得到默认值15。该属性应该在构造函数中设置还是在更高版本中设置 我做错了什么?在你的xaml中,做什么 <controls:MyView ID="{Binding Id}" /> 在你的xaml中,做什么 <contr

我在自定义控件中使用可绑定属性,以便从xaml代码中设置属性。然而,我的属性似乎总是会得到我为bindable属性指定的默认值

我的xaml代码:

<controls:MyView ID="4" />
在本例中,我希望我的属性应该得到值4,但它总是得到默认值15。该属性应该在构造函数中设置还是在更高版本中设置

我做错了什么?

在你的xaml中,做什么

<controls:MyView ID="{Binding Id}" />
在你的xaml中,做什么

<controls:MyView ID="{Binding Id}" />

如果不绑定,则不需要Bindable属性,只需创建一个int类型的普通属性,将ID作为属性名。然后可以从XAML分配ID。(Intellisense也将显示ID属性)


如果不绑定,则不需要Bindable属性,只需创建一个int类型的普通属性,将ID作为属性名。然后可以从XAML分配ID。(Intellisense也将显示ID属性)


为什么要在自定义控件中嵌入
ViewModel
。自定义控件背后的思想是可以重用它并将其绑定到父控件的
ViewModel
。设想一个简单的
按钮
控件,只需将其放在屏幕上并设置
BindableProperties
文本
命令
等,它就可以重复使用。默认情况下,它的
绑定上下文
与其父控件相同

在您的例子中,由于将
BindingContext
设置为一个私有的自定义
ViewModel
类,因此可以将控件与任何修改隔离开来。你必须重新考虑你的解决方案

它应该简单到:

public partial class MyView : ContentView
{
    public static readonly BindableProperty IDProperty = BindableProperty.Create(
                                    nameof(ID),
                                    typeof(int),
                                    typeof(MyView),
                                    15);
    public int ID
    {
        get => (int)GetValue(IDProperty);
        set => SetValue(IDProperty, value);
    }

    public MyView()
    {
        InitializeComponent();
    }
}

为什么要在自定义控件中嵌入
ViewModel
。自定义控件背后的思想是可以重用它并将其绑定到父控件的
ViewModel
。设想一个简单的
按钮
控件,只需将其放在屏幕上并设置
BindableProperties
文本
命令
等,它就可以重复使用。默认情况下,它的
绑定上下文
与其父控件相同

在您的例子中,由于将
BindingContext
设置为一个私有的自定义
ViewModel
类,因此可以将控件与任何修改隔离开来。你必须重新考虑你的解决方案

它应该简单到:

public partial class MyView : ContentView
{
    public static readonly BindableProperty IDProperty = BindableProperty.Create(
                                    nameof(ID),
                                    typeof(int),
                                    typeof(MyView),
                                    15);
    public int ID
    {
        get => (int)GetValue(IDProperty);
        set => SetValue(IDProperty, value);
    }

    public MyView()
    {
        InitializeComponent();
    }
}

我知道现在为时已晚,但我已经忍受了一段时间,因为我不知道的原因,ContentView(自定义视图元素)在您以任何方式设置其BindingContext属性时都不会绑定,除了以下方式:

<ContentView x:Class="mynamespace.CustomViews.MyView"
....
 x:Name="this">

然后在主容器元素(在我的例子中是一个框架)上设置BindingContext



在构造函数中设置BindingContext(在MyView.xaml.cs中)不起作用,而这种方式——以及其他方式——在将视图绑定到另一个类(主要是ViewModel)时起作用,但在将ContentView绑定到它的codeBehind.cs文件时——我重复一遍——它不起作用。

我觉得为时已晚,但我已经痛苦了一段时间,由于我不知道的原因,当您以以下方式设置ContentView(自定义视图元素)的BindingContext属性时,它不会绑定:

<ContentView x:Class="mynamespace.CustomViews.MyView"
....
 x:Name="this">

然后在主容器元素(在我的例子中是一个框架)上设置BindingContext



在构造函数中设置BindingContext(在MyView.xaml.cs中)不起作用,而这种方法和其他方法在将视图绑定到另一个类(主要是ViewModel)时起作用,它在将ContentView绑定到其codeBehind.cs文件时不起作用。

但是我不需要bindableproperty。。。我要做的是从xaml分配控件属性。我打算有两个不同ID号的控件,比如:是的,我有。但主要目的是在控件上设置一个id,这对于应用程序的其余部分是必需的。。。我要做的是从xaml分配控件属性。我打算有两个不同ID号的控件,比如:是的,我有。但是主要目的是在控件上设置一个id,这对于应用程序的其余部分是必需的。您可以共享控件的所有代码,尤其是构造函数吗?可能您设置的BindingContext不正确…@EvZ我已更新了上述代码。为什么将ViewModel嵌入到CustomControl中?它不起作用,因为
BindingContext
指向
MyViewModel
对象。如果要使其正常工作,请更改
BindingContext=viewModel
by
BindingContext=this
。顺便说一句,
myviewmodel
字段不是必需的。我希望有帮助。你能分享你控件的所有代码,尤其是构造函数吗?可能您设置的BindingContext不正确…@EvZ我已更新了上述代码。为什么将ViewModel嵌入到CustomControl中?它不起作用,因为
BindingContext
指向
MyViewModel
对象。如果要使其正常工作,请更改
BindingContext=viewModel
by
BindingContext=this
。顺便说一句,
myviewmodel
字段不是必需的。我希望有帮助。好吧,它似乎也不起作用。是的,我可以通过Intellisense看到它,但是不管我分配什么值,属性的值总是零。好的,它似乎也不起作用。是的,我可以通过Intellisense看到它,但是属性的值始终为零,无论我分配什么值。
<Frame BindingContext="{x:Reference this}"
....>