簡體   English   中英

Xamarin.Forms,XAML,綁定和isVisible

[英]Xamarin.Forms, XAML, Bindings and isVisible

我(顯然是關於這個問題的)是新手,所以在此先感謝您的幫助! 我希望在數小時內盡力而為時,希望有人可以加快我的學習速度:)

附錄:我也曾在Xamarin論壇上發布過,但是就問題的解答數量而言,這似乎已經死了。 因此,我希望沒有人冒犯。

因此,我有了XAML MainPage:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="cant post links"
             xmlns:x="cant post links"
             xmlns:local="clr-namespace:App.ViewModels"
             x:Class="App.ViewModels.MainPage">

    <ContentPage.BindingContext>
        <local:User/>
    </ContentPage.BindingContext>

    <StackLayout>
        <Label Text="Test"/>
        <ListView ItemsSource="{Binding Changes}"
                  x:Name="ChangesList"
                  HasUnevenRows="True"
                  Margin="40,80"
                  ItemTapped="ListView_ItemTapped">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="{Binding Name}"/>
                            <Button Text="Details"
                                    IsVisible="{Binding IsVisible}"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Button Text="Press to add" x:Name="addItem" Clicked="addItem_Clicked"/>
    </StackLayout>

</ContentPage>

我有一個具有相應屬性的數據模型。 當我離開MainPage類構造函數時,如下所示:

public MainPage()
{
    InitializeComponent();
}

我沒有列出項目。

因此,第一個問題:我認為,基於綁定,該應用程序將自動生成一個User實例並將其分配給列表?

正如我在調試器中看到的那樣,實際上生成了一個User實例,並將其分配給BindingContext,但是ChangesList.ItemsSource保持為空。

因此,我更改了構造函數的代碼:

public MainPage()
{
    InitializeComponent();
    var bc = BindingContext;
    var list = ChangesList.ItemsSource;
    ChangesList.ItemsSource = (bc as User).Changes;
}

這使我可以在編譯和運行應用程序時查看包含項目的列表。 另外,我可以通過“ addItem”按鈕后面的代碼將新項目添加到列表中。 但是:當我點擊一個項目時,什么也沒有發生。 該代碼如下所示:

private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
{
    var change = e.Item as Change;
    change.IsVisible = !change.IsVisible;
}

數據方法如下所示:

 public class Change : INotifyPropertyChanged
{
    public string Name { get; set; }
    bool isVisible = false;

    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsVisible
    {
        get
        {
            return isVisible;
        }
        set
        {
            isVisible = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Change-IsVisible"));
        }
    }
}

因此,第二個問題是:為什么Button不更改其可見性狀態而變得可見?

提前非常感謝您!

編輯:添加了完整的“更改”類代碼。

編輯2:用戶代碼。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.ComponentModel;
using Xamarin.Forms;
using System.Diagnostics;

namespace App.ViewModels
{
    public class User : INotifyPropertyChanged
    {
        public string Username { get; set; }
        public ObservableCollection<Change> Changes = null;   
        public event PropertyChangedEventHandler PropertyChanged;

        public User()
        {
            Changes = new ObservableCollection<Change>();
            addChange("Test 1");
            addChange("Test 2");

        }

        public void addChange(string text)
        {
            Change c = new Change
            {
                Name = text,
                IsVisible = false
            };
            Changes.Add(c);
            refresh();
        }

        public void refresh()
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Changes"));
        }
    }
}

對於第二個問題,請嘗試:

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsVisible"));

對於第一個問題-您能否分享您的用戶源代碼

請嘗試以下操作:

將用戶類中的獲取器/設置器更改為:

public string Username
{
    get { return username;}
    set { username = value; OnPropertyChanged("Username");
}
private string username = string.Empty;

public ObservableCollection<Change> Changes
{
    get { return changes; }
    set { changes = value; OnPropertyChanged("Changes");
}
private ObservableCollection<Change> changes = null;

向該類添加一個新方法:public void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName)); }

然后確保您在Changes類中相應地實現了上面修改的代碼。

最后,在MainPage類構造函數中設置頁面的綁定上下文:

public MainPage(User user)
{
    InitializeComponent();
    BindingContext = user;
}

一些解釋:綁定上下文必須包含您的數據模型類,在您的情況下為User。

你在做什么

var bc = BindingContext;
ChangesList.ItemsSource = (bc as User).Changes;

正在嘗試將MainPage的未設置BindingContext強制轉換為User,這將是空的。

因此,為了在Xaml中使用BindingContext,必須將其設置為用戶類的實例,否則屏幕上將不會顯示任何數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM