我想像下面这样x:DataType
使用BindingContext
。
<ContentPage
x:DataType="local:MainPageViewModel">
<ContentPage.BindingContext>
<local:MainPageViewModel />
</ContentPage.BindingContext>
<Label
x:DataType="local:TitleViewModel"
BindingContext ="{Binding InnerViewModel}"
Text="{Binding Title}" />
</ContentPage>
抱歉@Jason,我以前的模拟代码过于简化而不会引起误导。因此我更新了我的模拟代码,如下所示。
public class MainPageViewModel
{
private TitleViewModel _innerViewModel;
public TitleViewModel InnerViewModel
{
get => _innerViewModel;
set => SetProperty(ref _innerViewModel, value);
}
}
public class TitleViewModel
{
private string _title;
public string Title
{
get => _title;
set => SetProperty(ref _title, value);
}
}
我不使用InnerViewModel.Title
绑定的原因是PropertyChanged
事件只检查属性路径。所以,如果我更新InnerViewModel.Title
,它会PropertyChanged
用 path 引发事件"Title"
,而不是"InnerViewModel.Title"
. 它会导致问题。
我知道我可以像下面那样解决,
public class MainPageViewModel
{
private void OnInnerViewModelPropertyChanged(object sender, PropertyChangedArgs e)
{
// ...
RaisePropertyChanged(this, "InnerViewModel.Title");
}
}
但是,我更喜欢改变BindingContext
而不是中继PropertyChanged
事件。
但是,由于以下原因,它构建失败。
错误 XFC0045:绑定:在“Local.TitleViewModel”上找不到属性“InnerViewModel”。
即使我x:DataType
像下面这样删除,仍然会失败,因为 MainPageViewModel 没有Title
属性。
<Label
BindingContext ="{Binding InnerViewModel}"
Text="{Binding Title}" />
因此,我放弃使用x:null
下面的编译绑定。
<Label
x:DataType="x:null"
BindingContext ="{Binding InnerViewModel}"
Text="{Binding Title}" />