我创建了一个具有步骤属性的自定义视图(NavProgressbar)。
private static readonly BindableProperty ProgressStepProperty = BindableProperty.Create(
nameof(ProgressStep), typeof(int), typeof(NavProgressbar),
0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);
private static void ProgressStepPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
//update view, removed for brevity
}
public int ProgressStep
{
get => (int)GetValue(ProgressStepProperty);
set => SetValue(ProgressStepProperty, value);
}
在我的 MvxContentPage 中,我可以通过设置 ProgressStep 的值来使用它
<npb:NavProgressbar
x:Name="NavProgressBar"
ProgressStep="2"/>
到目前为止,这有效。现在我想从我的视图模型中设置它,所以在我的视图模型中我创建了一个属性...
private int _progressStep;
public int ProgressStep
{
get => _progressStep;
set => SetProperty(ref _progressStep, value);
}
...在我的 MvxContentPage 中,我通过执行以下操作绑定到我的 viewmodel 属性,而不是固定值:
<npb:NavProgressbar
x:Name="NavProgressBar"
ProgressStep="{Binding ProgressStep}"/>
但这不起作用。按钮和标签等的其他绑定工作正常。
我的错误在哪里?编辑:在我的 MvxContentPage 中,我设置了 NavProgressbar
xmlns:viewModels="clr-namespace:x.y.z.ViewModels;assembly=myAssembly"
x:TypeArguments="viewModels:myViewModel"
x:DataType="viewModels:myViewModel"
Resharper 在绑定中显示
ProgressStep="{Binding path={myViewModel}.ProgressStep}"
所以我认为绑定上下文设置正确。
也许视图和视图模型是抽象的并且我正在使用这个抽象视图和视图模型的子类也很重要?其他绑定按预期工作,例如对于 Resharper 显示的按钮
<Button
Text="{Binding path={myViewModel}.ButtonText}"
当使用
{Binding _____}
连接 C# 属性时,XAML 需要知道它绑定到什么。默认情况下,它将绑定到与其关联的代码隐藏文件。以下内容可能适合您(仔细检查命名空间是否正确):
<npb:NavProgressbar
x:Name="NavProgressBar"
ProgressStep="{Binding ProgressStep}"
<npb:NavProgressbar.BindingContext>
<npb:NavProgressBarViewModel />
</npb:NavProgressbar.BindingContext>
/>
Microsoft 的此页面提供了一些关于 BindingContext 如何工作的好示例:
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm
private static readonly BindableProperty ProgressStepProperty =
BindableProperty.Create(nameof(ProgressStep), typeof(int), typeof(NavProgressbar), 0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);
我做到了,但它必须是公开的
public static readonly BindableProperty ProgressStepProperty =
BindableProperty.Create(nameof(ProgressStep), typeof(int), typeof(NavProgressbar), 0, BindingMode.TwoWay, propertyChanged: ProgressStepPropertyChanged);
找不到“ValueTitle”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。
这是我在海关监管内的可绑定财产。
public readonly BindableProperty TitleValueProperty = BindableProperty.Create(
nameof(TitleValue),
typeof(string),
typeof(FlexBetweenView),
string.Empty,
propertyChanged: (bindable, oldvalue, newvalue) =>
{
var cntrl = (FlexBetweenView)bindable;
cntrl.valueLbl.Text = newvalue as string;
});
public string TitleValue
{
get => GetValue(TitleValueProperty).ToString();
set => SetValue(TitleValueProperty, value);
}
这是我的视图模型
[QueryProperty(nameof(BookDetails), nameof(BookDetails))]
public partial class BookDetailViewModel : ObservableObject
{
[ObservableProperty]
public BookDetailModel bookDetails;
}
我在这个页面中使用flex Betweenview
<ContentPage.BindingContext>
<vm:BookDetailViewModel />
</ContentPage.BindingContext>
<ScrollView>
<VerticalStackLayout>
<Label Text="{Binding BookDetails.title}" />
<controls:FlexBetweenView Title="Name" TitleValue="{Binding BookDetails.title}">
</controls:FlexBetweenView>
</VerticalStackLayout>
</ScrollView>
使用像这样的硬编码字符串
<controls:FlexBetweenView Title="Name" TitleValue="Random Title">
工作正常请你们帮帮我吧