Итак, после просмотра вашего примера выясняется, что это немного сложная проблема.Так что, если мое объяснение не ясно, пожалуйста, дайте мне знать.
В основном проблема заключается в следующих двух частях кода:
MainPage.xaml (строка 14):
<local:ItemComponent Item="{Binding Demo}" />
ItemComponent.xaml.cs (строка 43):
public ItemComponent()
{
InitializeComponent();
vm = new ItemComponentViewModel();
BindingContext = vm; //this breaks the functionality
}
Первая часть, в которой вы говорите, чтобы она связывалась со свойством Demo
, и, как обычно, ищет это свойство в своем BindingContext.Однако во второй части вы переопределяете его BindigContext и устанавливаете для него ItemComponentViewModel
этот ViewModel, однако, не имеет свойства Demo
, поэтому {Binding Demo}
не работает на этом новом установленном вами BindingContext.
Теперь возможным решением для вашего демонстрационного приложения было бы изменить MainPage.xaml на следующий код:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:SampleApp"
x:Class="SampleApp.MainPage"
x:DataType="local:MainViewModel"
x:Name="MyDemoPage">
<StackLayout>
<Label Text="Manual:" />
<Label Text="{Binding Demo.Title}" />
<Label Text="Component: " />
<local:ItemComponent Item="{Binding Path=BindingContext.Demo, Source={x:Reference MyDemoPage}}" />
</StackLayout>
</ContentPage>
По сути, теперь мы помещаем привязку Demo
вне BindingContext нашего ItemComponent
элемента управления.Однако, если вы хотите использовать его в ListView (если я правильно помню из вашего исходного вопроса, это решение может не сработать, и возможно, вам придется отбросить ItemComponentViewModel
и привязать непосредственно к свойствам (ListView уже убедится, чточто BindingContext вашего ItemComponent
установлен на текущий Item, нет необходимости передавать его через связываемое свойство.
Надеюсь, это поможет!