我有一個程式,用戶必須根據串列視圖項(章節)在協議中單擊的章節從 json 獲取文本
出錯的地方在于,當用戶沒有選擇協議中的第一章時,他點擊了下一步按鈕。他總能看到屬于第一章的ID 2!我如何讓它點擊用戶看到具有以下 id 的文本的任何章節?
我遇到的下一個問題是當我在最后一章時,我點擊回傳然后我進入另一章System.NullReferenceException: 'Object reference not set to an instance of an object.'繼續string nextTitile = _protocol.Name " - " content.NavTitle;
我該如何解決?
用戶在此處選擇協議中的所選章節
//for chosen step inside protocol
//for chosen step inside protocol
public void Handle_ItemTapped(object sender, ItemTappedEventArgs e)
{
//change title based on clicked step
var tappedStep = (Content)MyListView.SelectedItem;
int stepIndex = (default);
Navigation.PushAsync(new StepView(_protocol, Title, tappedStep.ChapterTitle, stepIndex));
//Deselect item
((ListView)sender).SelectedItem = null;
}
這是用戶獲取與所選章節相關聯的文本的 stepview 類。用相應的后退和下一個按鈕轉到下一個文本
public partial class StepView : ContentPage
{
//get step
private Protocol _protocol;
//go to selected step
public StepView(Protocol protocol, string title, string chapterTitle)
{
_protocol = protocol;
InitializeComponent();
Title = title " - " chapterTitle;
// get label text
lblText.Text = protocol.Contents.FirstOrDefault(x => x.ChapterTitle == chapterTitle).Text;
}
private int index;
public void BtnBack_Clicked(object sender, EventArgs e)
{
index--;
var firstId = _protocol.Contents.FirstOrDefault(x => x.Contentid != null).Contentid;
BtnNext.IsEnabled = true;
if (index == firstId - 1)
{
BtnBack.IsEnabled = false;
}
var content = _protocol.Contents.ElementAtOrDefault(index);
lblText.Text = content?.Text;
//get current navTitle on button click
getNewNavTitle(content);
}
public void BtnNext_Clicked(object sender, EventArgs e)
{
index ;
BtnBack.IsEnabled = true;
if (index == _protocol.Contents.Count - 1)
{
BtnNext.IsEnabled = false;
}
var content = _protocol.Contents.ElementAtOrDefault(index);
lblText.Text = content?.Text;
//get current navTitle on button click
getNewNavTitle(content);
}
//get new protocol chapter based on btnBack and btnNext
private void getNewNavTitle(Content content)
{
Title = null;
string nextTitile = _protocol.Name " - " content.NavTitle;
Title = nextTitile;
}
//go back to home
public void btnHome_Clicked(object sender, EventArgs e)
{
//go to mainpage
Navigation.PushAsync(new MainPage());
}
這是我使用的json
{
"protocols": [
{
"id": "1",
"name": "Pols meten",
"contents": [
{
"chapterTitle": "Voorzorg",
"contentid": "1",
"navTitle": "Voorzorg",
"text": "voor blabla"
},
{
"contentid": "2",
"navTitle": "Voorzorg",
"text": "voor blabla2"
},
{
"contentid": "3",
"navTitle": "Voorzorg",
"text": "voor blablabla3"
},
{
"contentid": "4",
"chapterTitle": "Handeling",
"navTitle": "Handeling",
"text": "Handeling blabla"
},
{
"contentid": "5",
"navTitle": "Handeling",
"text": "Handeling blabla2"
},
{
"contentid": "6",
"navTitle": "Handeling",
"text": "Handeling blybli3"
},
{
"contentid": "7",
"chapterTitle": "Nazorg",
"navTitle": "Nazorg",
"text": "Nazorg blabla"
},
{
"contentid": "8",
"navTitle": "Nazorg",
"text": "Nazorg blabla2"
},
{
"contentid": "9",
"navTitle": "Nazorg",
"text": "Nazorg blybli3"
}
]
}
]
}
這是我的領域類
public partial class RootObject
{
[JsonProperty("protocols")]
public List<Protocol> Protocols { get; set; }
}
public partial class Protocol
{
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("contents")]
public List<Content> Contents { get; set; }
}
public partial class Content
{
[JsonProperty("contentid")]
public long Contentid { get; set; }
[JsonProperty("chapterTitle", NullValueHandling = NullValueHandling.Ignore)]
public string ChapterTitle { get; set; }
[JsonProperty("text")]
public string Text { get; set; }
}
我該如何解決我的問題
uj5u.com熱心網友回復:
我認為這兩個問題都與未index在StepView建構式中設定屬性有關。如果沒有顯式值,新StepView實體的index屬性將設定為default(int),即0。
單擊“下一步”按鈕始終顯示第二步,因為它BtnNext_Clicked正在遞增index(到1,因為它是0),然后在該索引處顯示該專案。
同樣,BtnBack_Clicked是遞減index(到-1,因為它是0),這意味著呼叫_protocol.Contents.ElementAtOrDefault(index)將回傳null- 稍后導致NullReferenceExceptionin getNewNavTitle。
您需要更新StepView建構式,以便它index正確設定初始值:
public StepView(Protocol protocol, string title, string chapterTitle, int stepIndex)
{
_protocol = protocol;
InitializeComponent();
Title = title " - " chapterTitle;
// get label text
lblText.Text = protocol.Contents.FirstOrDefault(x => x.ChapterTitle == chapterTitle).Text;
// Set the "index" property here. You need to make sure that the "stepIndex"
// constructor parameter has the appropriate value.
index = stepIndex;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360053.html
上一篇:.net6&MoreLinq:System.Linq.Enumerable.DistinctBy和MoreLinq.MoreEnumerable.DistinctBy之間的呼叫不明確
