具有可绑定组件的DataTemplate

时间:2019-02-27 17:57:58

标签: data-binding xamarin.forms xamarin-binding

我有一个带有数据模板的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 :(得分:-1)

/iphone-theme无约束。您应该做的是这样的:

ListItem="{Binding}"

似乎您正在尝试将ListItem的当前实例绑定到ListItemView控件内的一个属性。您可以通过返回自身的ListItem类中的属性来执行此操作,如下所示:

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

然后,您可以轻松绑定到它:

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

但是,就像您可能也感觉到的那样,它闻起来真的很不好。那是因为不是很正确的等待时间来实现您要完成的任务。您应该在ListItemView中公开不同的属性,这些属性会将自己绑定到ListItem中的其他属性。如果您觉得实际上是在复制一堆属性而没有实际目标,那么也许您实际上不需要使用自定义控件来打印ListItem。