对象绑定不起作用

时间:2017-11-20 13:50:23

标签: c# xaml data-binding xamarin.forms xamarin.android

我正在使用XF列表视图,并希望绑定整个对象,然后使用转换器根据某些条件格式化数据,但对象绑定在XF中不再起作用。测试在XF 2.5.0.91635和android支持库26.1.0.1上进行。首先,当不使用项目模板时,列表视图会正确呈现,尽管内容显示默认对象字符串:

<ListView x:Name="lv"></ListView>

enter image description here

但是在使用项目模板时,没有显示任何内容,尽管项目数量确实已添加到列表视图中,并且项目选择事件已正确触发。此外,调试输出以下消息:

        <ListView x:Name="lv">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding}"></Label>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

enter image description here

[0:] Binding: Models.DataItem can not be converted to type 'System.String'
[0:] Binding: Models.DataItem can not be converted to type 'System.String'
[0:] Binding: Models.DataItem can not be converted to type 'System.String'
[0:] Binding: Models.DataItem can not be converted to type 'System.String'
[0:] Binding: Models.DataItem can not be converted to type 'System.String'

当我将转换器添加到绑定表达式时,convert函数总是在其参数中接收null。

添加绑定代码:

List<DataItem> list = new List<DataItem>();
        for(int i = 0; i < 10; i++)
        {
            list.Add(new DataItem
            {
                N = "L " + i.ToString(),
                C = i + 1,
            });
        }
        lv.ItemsSource = list;

2 个答案:

答案 0 :(得分:1)

  

当我将转换器添加到绑定表达式时,convert函数总是在其参数中接收null。

如果要绑定到整个对象,则需要像这样修改public class DataItem { public String N { get; set; } public int C { get; set; } //use an Item property to reference itself public DataItem Item { get { return this; } } }

ListView

然后你可以在<ListView x:Name="lv" > <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Label Text="{Binding Item,Converter={StaticResource YourConverter}}" ></Label> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> 和转换器中一起使用它

Iterable

答案 1 :(得分:0)

正确的绑定方式是“将集合绑定到ListView”并为列表提供ItemSource

例如:

private ObservableCollection<Models.DataItem> _dataList;
public ObservableCollection<Models.DataItem> DataList
{
    get { return _dataList; }
    set
    {
        _dataList = value;
        RaisePropertyChanged(() => DataList); // you can use your own property notification mechanism here.
    }
}

然后将绑定上下文设置为ViewModel:

<ListView ItemsSource="{Binding DataList}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Label Text="{Binding . }" />
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

或者,如果您想显示以下DataItem

的属性
public class Model.DataItem
{
    public string Property1 {get; set; } 
    public string Property2 {get; set; }
    public string Property3 {get; set; }
}

使用

<ViewCell>
    <Label Text="{Binding Property1 }" />
    <Label Text="{Binding Property2 }" />
    <Label Text="{Binding Property3 }" />
</ViewCell>

希望这有帮助