我正在使用 Xamarin ListView 和 Picker,試圖創建一個在一個頁面(視圖)中計算學生 GPA 的 android 應用程式。我有一個GPADetails負責 Picker 屬性的類。此類包含一個“串列”...
public ObservableRangeCollection<string> UnitList{get;set;}
...系結到ItemSourcePicker 的單位。它還包含一個“屬性欄位”...
private string selectedUnit=null;
public string SelectedUnit { get => selectedUnit;
set => SetProperty(ref selectedUnit, value); }
...系結到 SelectedItem選擇器的屬性。
ListView 正在通過系結“串列”來填充...
public ObservableRangeCollection<GPADetails> GPADetailsList {get;set;}GPADetails...型別類
的多個物件到ItemSourceListView 的。(以便用戶可以為不同的主題選擇不同的單位)這是填充 listView 的函式
public void DisplayTemplates()
{
GPADetailsList.Clear();
//Instantiates template object equivalent to the number of courses
for (int i = 0; i < int.Parse(NumberOfCourses); i )
{
GPADetailsList.Add(
new GPADetails
{
//initializing picker properties with picker items
UnitList = UnitItems,
SelectedUnit = null,
TemplateID = i,
});
}
}
這是 ListView 和選擇器的 Xaml ......
<ListView x:Name="listView" ItemsSource="{Binding GPADetailsList}" SelectionMode="None" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout >
<Editor Placeholder="Course Code" PlaceholderColor="White" HorizontalOptions="StartAndExpand">
</Editor>
<Picker x:Name="PickerUnit" Title="Pick a Unit" TitleColor="white"
HorizontalOptions="EndAndExpand"
VerticalOptions="Fill" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" FontSize="15"
ItemsSource="{Binding UnitList}"
SelectedItem="{Binding SelectedUnit, Mode=TwoWay }"
>
</Picker>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
...
現在這是我遇到問題的地方。每次用戶在頁面上選擇一個單元時,selectedItem都會觸發選取器的屬性。并且類的SelectedUnit屬性GPADetails檢測到屬性發生了變化。我想SelectedItem將 ListView 下的每個 Picker 存盤在一個陣列中。使用TemplateIDclass的屬性GPADetails,我可以跟蹤選擇了哪個選擇器。所以我TemplateID用作我的陣列的索引。但是我一直遇到問題,因為我的 C# 很弱。
SelectedUnit我嘗試在類的屬性中執行此 操作,GPADetails方法是使用 set 訪問器中的條件并使用selectedUnit. 這是代碼..
private string selectedUnit;
public string SelectedUnit
{
get { return selectedUnit; }
set
{
SetProperty(ref selectedUnit, value);
if (selectedUnit != null)
SelectedUnitList[TemplateID] = selectedUnit;
}
}
但是這樣一來,我只能為陣列分配一個值,如果我嘗試分配另一個值,則先前分配的索引將回傳默認值 null。
PS我不知道我是否問對了,但任何幫助將不勝感激,感謝dev fam ...
uj5u.com熱心網友回復:
我洗掉了我的原始帖子,以下是我的新答案。
在DisplayTemplate中創建的每個實體都是分開的。這意味著每個實體都有不同的 SelectedUnitList。這就是為什么您只能在 SelectedUnitList 中設定一個選擇器值的原因。
這里我給你一些建議。
在您的GPADetails.cs中,添加一個新屬性,即名為SelectedUnitDict的字典。(與SelectedUnitList相比,我更喜歡使用字典作為陣列的索引,這很容易導致麻煩):
public Dictionary<int,string> SelectedUnitDict { get; set; } //The key(int) is *TemplateID* and the value(string) is *SelectedItem*.
在您的GPACalculationViewmodel中,還創建一個屬性(為方便起見,我只是使用相同的名稱):
public Dictionary<int, string> SelelctedUnitDict { get; set; }
并在DisplayTemplates方法中添加一個新行,使 GPADetails 的每個實體在GPACalculationViewmodel中獲得相同的SelectedUnitDict。
for (int i = 0; i < int.Parse(NumberOfCourses); i )
{
GPADetailsList.Add(
new GPADetails
{
//initializing picker properties with picker items
UnitList = UnitItems,
SelectedUnit = null,
TemplateID = i,
// Add this new line
SelelctedUnitDict = SelelctedUnitDict
});
最后,在GPADetails.cs中,就像您的代碼一樣:
public string SelectedUnit
{
...
set
{
...
if (selectedUnit != null)
{
SelectedUnitDict[TemplateID] = selectedUnit;
}
}
}
這對我有用。我可以在GPACalculationViewmodel的SelectedUnitDict中獲取每個選擇器的 selectedItem 。鍵是TemplateID,值是SelectedItem。
希望我的回答能幫到你。
uj5u.com熱心網友回復:
我認為您可以使用屬性/事件與 the 進行互動,ListView而不是依賴于 observable 屬性。
您可以使用ItemSelected
<ListView ItemsSource="{x:Static local:interactiveListViewXaml.items}" ItemSelected="OnSelection" ItemTapped="OnTap" IsPullToRefreshEnabled="true" Refreshing="OnRefresh">
https://github.com/xamarin/xamarin-forms-samples/blob/main/UserInterface/ListView/Interactivity/interactivityListView/interactivityListView/Views/interactiveListViewXaml.xaml
關于實作我不確定這TemplateID是什么或所有這句話I want so store the SelectedItem of each Picker under the ListView in an array using a property我不明白
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529679.html
