DataTemplate с привязываемым компонентом - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть ListView с шаблоном данных.Я пытаюсь создать пользовательский компонент, который поддерживает привязку к содержимому шаблона данных.

Вот ListView на странице:

<ListView ItemsSource="{Binding List}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="entities:ListItem">
            <ViewCell>
                <components:ListItemView ListItem="{Binding}" />
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

И это объявление ListItemView:

public partial class ListItemView : StackLayout
{

    public static readonly BindableProperty ListItemProperty
        = BindableProperty.Create(
                    nameof(ListItem), typeof(ListItem), typeof(ListItemView), null,
                    defaultBindingMode: BindingMode.TwoWay,
                    propertyChanged: ListItemPropertyChanged);

    static void ListItemPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var view = (ListItemView)bindable;
        view.ListItem = (ListItem)newValue;
    }


    public ListItem ListItem
    {
        get => (ListItem)GetValue(ListItemProperty);
        set
        {
            SetValue(ListItemProperty, value);
            if (_viewModel != null) // never hits this break point
                _viewModel.ListItem = value;
        }
    }

У меня была точка останова на линиис комментарием.Эта точка останова никогда не была достигнута.ListItemView однако инициализируется и создается.

Обновление

Я попробовал простую демонстрацию, чтобы убедиться, что проблема была в привязке,

<StackLayout Padding="5">
    <Label Text="{Binding Demo.Title}" />
    <components:CheckListView ListItem="{Binding Demo}" />
</StackLayout>

Приведенный выше код был снаружипредставление списка , и я могу видеть заголовок.Точка останова все еще не достигнута.

1 Ответ

0 голосов
/ 28 февраля 2019

ListItem="{Binding}" ни к чему не обязывает.Что вы должны сделать, это примерно так:

<components:ListItemView ListItem="{Binding [YouShouldBindToSomethingHere]}" />

Кажется, что вы пытаетесь связать текущий экземпляр ListItem со свойством внутри элемента управления ListItemView.Вы можете сделать это через свойство внутри вашего класса ListItem, которое возвращает себя, например, так:

public class ListItem
{
    public ListItem Instance
    {
        get => this;
        set => this = value;
    }
}

Тогда вы можете легко привязаться к нему:

<components:ListItemView ListItem="{Binding Instance}" />

Но, как вы, вероятно, чувствуетеэто тоже пахнет очень плохо.Это потому, что это не совсем правильное ожидание, чтобы достичь того, что вы пытаетесь сделать.Вы должны предоставить различные свойства в вашем ListItemView, которые связывают себя с другими свойствами в вашем ListItem.Если вы чувствуете, что на самом деле дублируете кучу свойств без реальной цели, то, возможно, вам на самом деле не нужно использовать пользовательский элемент управления для печати вашего ListItem.

...