我有一个带有数据模板的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>
上面的代码位于列表视图之外 ,我可以看到标题。断点仍未命中。
答案 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。