0

我想像下面这样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}" />
4

0 回答 0