![](/img/trans.png)
[英]how to upper/lower case resx bindings in xaml in xamarin.forms?
[英]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.