我们如何将数据绑定到Xamarin表单中的“页脚”

时间:2019-05-15 13:14:24

标签: xamarin xamarin.forms

我们如何将数据绑定到Xamarin表单中footer内的ListView上,这里我需要将count_in值传递给页脚。

<ListView  x:Name="listView">
        <ListView.Footer>
            <StackLayout>
                <Label Text="{Binding Count}" BackgroundColor="Gray"></Label>
            </StackLayout>
        </ListView.Footer>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="2*"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="2*"/>
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding image}" WidthRequest="50" HeightRequest="50" Grid.Column="0" VerticalOptions="Center"/>
                        <StackLayout Grid.Column="1">
                            <Label Text="{Binding FullName}" TextColor="#f35e20" HorizontalTextAlignment="Center"/>
                        </StackLayout>
                        <StackLayout Grid.Column="2">
                            <Label Text="{Binding SoccerStatus}" HorizontalTextAlignment="Center" TextColor="#503026"/>
                        </StackLayout>
                        <StackLayout Grid.Column="3">
                            <Label Text="{Binding CurrentDate}" HorizontalTextAlignment="Center" TextColor="#503026"/>
                        </StackLayout>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>

    </ListView>

下面是DisplayCount()从数据库中获取计数;

 public void DisplayCount()
        {
           var datetoday = DateTime.Now.ToString("ddMMyyyy");
           var count_in = (from x in conn.Table<SoccerAvailability>().Where(x => string.Equals(x.SoccerStatus, "IN", StringComparison.OrdinalIgnoreCase) && x.CurrentDate == datetoday) select x).Count();

        }

enter image description here

3 个答案:

答案 0 :(得分:2)

您绑定到Count

<Label Text="{Binding Count}" BackgroundColor="Gray"></Label>

因此Count必须是ViewModel上的公共属性

public int Count { get; set; }

答案 1 :(得分:1)

  

现在获取数据库异常SQLite异常没有这样的功能   等于

这是因为SQLLite linq无法识别string.Equals方法。您可以使用ToListAsync将其转换为列表,以用于一种情况。然后使用equals过滤c#列表对象:

var datetoday = DateTime.Now.ToString("ddMMyyyy");

var items = await conn.Table<SoccerAvailability>().Where(x => x.CurrentDate == datetoday).ToListAsync();
var finalsItems = items.Where(x => string.Equals(x.SoccerStatus, "IN", StringComparison.OrdinalIgnoreCase)).ToList();

Count = finalsItems.Count();

最后,将标签的文本绑定到此Count属性。

编辑有关绑定的信息:

您是否已将内容页面设置为ViewModel?此外,在您的视图模型中实现INotifyPropertyChanged接口:

// Set your page's binding context
BindingContext = new PageViewModel();

public class PageViewModel : INotifyPropertyChanged
{
    int count;
    public int Count
    {
        set
        {
            if (count != value)
            {
                count = value;
                onPropertyChanged();
            }
        }
        get
        {
            return count;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void onPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

编辑2:

如果您不使用视图模型,请在页脚标签上设置一个名称:

<ListView.Footer>
    <StackLayout>
        <Label x:Name="FooterLabel" BackgroundColor="Gray"></Label>
    </StackLayout>
</ListView.Footer>

然后直接设置其值:

//...
FooterLabel.Text = finalsItems.Count().ToString();

答案 2 :(得分:0)

您需要为页脚指定绑定上下文。

默认情况下,列表视图中的页脚,页眉和模板,其绑定上下文将是当前显示的项目。因此,在这种情况下,Count必须是ItemsSource上项目的公共财产。将Count绑定指向您的视图模型。

<Label Text="{Binding BindingContext.Count, Source={x:Reference xNameSetForCurrentPage}" BackgroundColor="Gray"></Label>

xNameSetForCurrentPage是在页面的最顶部元素(所有xmlns内容所在的位置)设置的x:Name="name"