C# 自定义控件中的Xamarin BindableProperty
我在自定义控件中使用可绑定属性,以便从xaml代码中设置属性。然而,我的属性似乎总是会得到我为bindable属性指定的默认值 我的xaml代码: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
<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
byBindingContext=this
。顺便说一句,myviewmodel
字段不是必需的。我希望有帮助。你能分享你控件的所有代码,尤其是构造函数吗?可能您设置的BindingContext不正确…@EvZ我已更新了上述代码。为什么将ViewModel嵌入到CustomControl中?它不起作用,因为BindingContext
指向MyViewModel
对象。如果要使其正常工作,请更改BindingContext=viewModel
byBindingContext=this
。顺便说一句,myviewmodel
字段不是必需的。我希望有帮助。好吧,它似乎也不起作用。是的,我可以通过Intellisense看到它,但是不管我分配什么值,属性的值总是零。好的,它似乎也不起作用。是的,我可以通过Intellisense看到它,但是属性的值始终为零,无论我分配什么值。
<Frame BindingContext="{x:Reference this}"
....>