我正在 Xamarin 中撰寫一個頁面,并且在 Picker 中系結到 ItemDisplayBinding 時遇到問題。我擁有的代碼顯示了我試圖系結它的主要組件。我可以設定 ItemsSource="{Binding terms}" 但如果我嘗試設定 ItemDisplayBinding="{Binding Name}",Visual Studio 會顯示“在資料背景關系 'SearchViewModel' 中找不到成員并且選擇器沒有被填充。所有我看過的解決方案沒有幫助我解決這個問題。
我的術語模型(在模型檔案夾中):
namespace ClassSearch.Models
{
public class Term
{
public string Code { get; set; }
public string Name { get; set; }
public Term(string code, string name)
{
Code = code;
Name = name;
}
}
}
我的瀏覽頁面:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ClassSearch.Views.SearchPage"
xmlns:viewmodel="clr-namespace:ClassSearch.ViewModels"
x:DataType="viewmodel:SearchViewModel"
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
ios:Page.UseSafeArea="True">
<ContentPage.BindingContext>
<viewmodel:SearchViewModel/>
</ContentPage.BindingContext>
<ContentPage.Content>
<Grid>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Frame Style="{StaticResource FrameStyle}" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0">
<Picker Title="Select"
ItemsSource="{Binding Terms}"
IsEnabled="{Binding IsNotBusy}"
/>
</Frame>
</Grid>
</ContentPage.Content>
</ContentPage>
我的視圖模型:
public class SearchViewModel : ViewModelBase
{
public ObservableRangeCollection<Term> Terms { get; set; }
public SearchViewModel()
{
Terms = new ObservableRangeCollection<Term>();
}
public async Task GetCurrentTerms()
{
IsBusy = true;
Terms = Terms ?? await CurrentTerm.GetTerms();
IsBusy = false;
}
}
SearchPage.xaml.cs 的 OnAppearing() 被覆寫
protected override async void OnAppearing()
{
base.OnAppearing();
if (BindingContext is SearchViewModel vm)
{
await vm.GetCurrentTerms();
}
}
看來這是導致問題的代碼,但我不明白問題是什么。
public static class CurrentTerm
{
public static async Task<ObservableRangeCollection<Term>> GetTerms()
{
ObservableRangeCollection<Term> terms = new ObservableRangeCollection<Term>();
// YYYY/MM/DD
DateTime currentDay = DateTime.Now.Date;
DateTime SummerCheck = new DateTime(currentDay.Year, 11, 01);
DateTime SpringCheck = new DateTime(currentDay.Year, 10, 01);
DateTime FallCheck = new DateTime(currentDay.Year, 03, 01);
if ((currentDay - SummerCheck).Days > 0)
{
var s = $"2{currentDay.Year % 100 1}4";
var sp = $"2{currentDay.Year % 100 1}1";
terms.Add(new Term(s, $"Summer {currentDay.Year 1}"));
terms.Add(new Term(sp, $"Spring {currentDay.Year 1}"));
}
else if ((currentDay - SpringCheck).Days > 0)
{
var sp = $"2{currentDay.Year % 100 1}1";
var f = $"2{currentDay.Year % 100}7";
terms.Add(new Term(sp, $"Spring {currentDay.Year 1}"));
terms.Add(new Term(f, $"Fall {currentDay.Year}"));
}
else if ((currentDay - FallCheck).Days > 0)
{
var f = $"2{currentDay.Year % 100}7";
var s = $"2{currentDay.Year % 100}4";
terms.Add(new Term(f, $"Fall {currentDay.Year}"));
terms.Add(new Term(s, $"Summer {currentDay.Year}"));
}
return terms;
}
}
uj5u.com熱心網友回復:
由于我沒有CurrentTerm.GetTerms(),我制作了一個示例,直接在GetCurrentTerms方法中添加資料供您參考。
xml:
<ContentPage.BindingContext>
<viewmodel:SearchViewModel/>
</ContentPage.BindingContext>
<ContentPage.Content>
<StackLayout>
<Picker Title="Select"
ItemsSource="{Binding Terms}"
ItemDisplayBinding="{Binding Name}"
/> <!--IsEnabled="{Binding IsNotBusy}"-->
</StackLayout>
</ContentPage.Content>
視圖模型:
public class SearchViewModel : ViewModelBase
{
public ObservableRangeCollection<Term> Terms { get; set; }
public SearchViewModel()
{
Terms = new ObservableRangeCollection<Term>();
}
public async Task GetCurrentTerms()
{
//IsBusy = true;
//Terms = Terms ?? await CurrentTerm.GetTerms();
//IsBusy = false;
Term term1 = new Term("1", "a");
Term term2 = new Term("2", "b");
Term term3 = new Term("3", "c");
Terms.Add(term1);
Terms.Add(term2);
Terms.Add(term3);
}
}

更新:
洗掉中的代碼OnAppearing。在 ViewModel 中設定資料,如下所示。
public static class CurrentTerm
{
public static ObservableRangeCollection<Term> terms { get; set; }
static CurrentTerm()
{
terms = new ObservableRangeCollection<Term>();
// YYYY/MM/DD
DateTime currentDay = DateTime.Now.Date;
DateTime SummerCheck = new DateTime(currentDay.Year, 11, 01);
DateTime SpringCheck = new DateTime(currentDay.Year, 10, 01);
DateTime FallCheck = new DateTime(currentDay.Year, 03, 01);
if ((currentDay - SummerCheck).Days > 0)
{
var s = $"2{currentDay.Year % 100 1}4";
var sp = $"2{currentDay.Year % 100 1}1";
terms.Add(new Term(s, $"Summer {currentDay.Year 1}"));
terms.Add(new Term(sp, $"Spring {currentDay.Year 1}"));
}
else if ((currentDay - SpringCheck).Days > 0)
{
var sp = $"2{currentDay.Year % 100 1}1";
var f = $"2{currentDay.Year % 100}7";
terms.Add(new Term(sp, $"Spring {currentDay.Year 1}"));
terms.Add(new Term(f, $"Fall {currentDay.Year}"));
}
else if ((currentDay - FallCheck).Days > 0)
{
var f = $"2{currentDay.Year % 100}7";
var s = $"2{currentDay.Year % 100}4";
terms.Add(new Term(f, $"Fall {currentDay.Year}"));
terms.Add(new Term(s, $"Summer {currentDay.Year}"));
}
}
}
視圖模型:
public class SearchViewModel : ViewModelBase
{
public ObservableRangeCollection<Term> Terms { get { return CurrentTerm.terms; } }
public SearchViewModel()
{
}
//public async Task GetCurrentTerms()
//{
// //IsBusy = true;
// //Terms = Terms ?? await CurrentTerm.GetTerms();
// //IsBusy = false;
// //Term term1 = new Term("1", "a");
// //Term term2 = new Term("2", "b");
// //Term term3 = new Term("3", "c");
// //Terms.Add(term1);
// //Terms.Add(term2);
// //Terms.Add(term3);
//}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487699.html
上一篇:當子頁面包裝在NavigationPage中時,為什么XamarinFormstabbedpage會引發未處理的例外?
