2017-03-12 7 views
1

私はXamarinとC#を初めて使っています。だから、私のコードが駄目なら私を許してください。xamarinリストにバインド

本質的に私は、コース名のリストを表示する単純なページを作成しようとしており、ボタンはビュー内のリストから項目を挿入または削除することができます。

現在のところ、プログラムはビルドされて実行されますが、ビューにはリストの内容は表示されません。どんな助けでも大歓迎です。ありがとう!

ここでは、ビューの:ここで

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="65" /> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="50" /> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Frame OutlineColor="Black" Grid.Row="0" Grid.ColumnSpan="2"> 
      <Label Text= "My Courses" FontSize="20" TextColor="Black" HorizontalTextAlignment="Center"/> 
     </Frame> 

     <Frame OutlineColor="Black" Grid.Row="1" Grid.ColumnSpan="2"> 

     <ListView x:Name="CourseList" ItemsSource="{Binding GetCourseList}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 

         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="50" /> 
          </Grid.ColumnDefinitions> 

          <Label FontSize="14" Text="{Binding Name}" TextColor="Black" Grid.Row="0" Grid.Column="0"/> 

          <Button FontSize="14" Text="X" TextColor="Black" Grid.Row="0" Grid.Column="1"/> 
         </Grid> 

        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

     </Frame> 

     <Button Text="+" FontSize="20" TextColor="Green" BackgroundColor="Silver" 
       HorizontalOptions="Fill" VerticalOptions="Center" 
       Grid.Row="2" Grid.ColumnSpan="2" 
       /> 
    </Grid> 

はView.csのコードは次のとおりです。

public partial class MainPage : ContentPage 
{ 
    MainPageViewModel vm;        

    public MainPage() 
    { 
     vm = new MainPageViewModel();     

     vm.AddCourse(); 

     BindingContext = vm; 

     InitializeComponent(); 
    } 

はここに表示モデルです:

class MainPageViewModel 
{ 
    public string Name { get; set; } 
    public List<Course> Courses; 


    public MainPageViewModel() 
    { 
     Courses = new List<Course>(); 
    } 


    public List<Course> GetCourseList() 
    { 
     return Courses; 
    } 

    public void AddCourse() 
    { 
     Course NewCourse = new Course(); 
     NewCourse.Name = "New Course Added"; 

     Courses.Add(NewCourse); 
    } 

} 

は最後に、ここに私のモデルがあります:

public class Course 
{ 
    public string Name { get; set; } 

} 

私はこのコードを使ってリストを表示することができましたが、リストから追加または削除したり、ボタンをクリックしてビューを更新することはできません。

public List<Course> Courses{ 
    get{ 
     return new List<Course>(){ 
      new Course(){Name = "Added a course"} 
      }; 
     } 
+0

リストの代わりにObservableCollectionを使用します。たぶんあなたはプロパティとしてそれを実行する必要があります。メソッドをバインドすることは決してありません。プロパティのみを使用することはできません。 Observableを使用する理由は、ビューが新しいアイテムを受信して​​ビューを更新するときにビューに通知するためです。 –

+0

チップをありがとう。私は今それを見るでしょう。 – johnZep

答えて

0

私はちょうど私のエラーと解決策を見つけたと思います。

public List<Course> Courses{ 
get{ 
    return new List<Course>(){ 
     new Course(){Name = "Added a course"} 
     }; 
    } 

コースは、「読み取り専用」と今私は、オブジェクトの実際のリストを保持するメンバ変数一覧VMCourseを作成し、に囲まれた、ビューに読み込まれるためにコースを使用していますビューにバインドされているため。

動作しているようですが、まだリストに追加したり削除したりするためのボタン機能をテストする必要があります。これはあなたにまともな解決策のように見えますか?

ありがとうございます!

class MainPageViewModel 
{ 
    public string Name { get; set; } 

    public List<Course> VMCourse; 


    //This is now bound to the view's listview 
    public List<Course> Courses { 
     get 
     { 
      return VMCourse; 
     } 
    } 


    public MainPageViewModel() 
    { 
     VMCourse = new List<Course>(); 
    } 

    public void AddCourse() 
    { 
     Course NewCourse = new Course(); 
     NewCourse.Name = "New Course Added"; 

     VMCourse.Add(NewCourse); 
    } 
0

リストをメソッドにバインドすることはできません。バインドはプロパティで使用する必要があります。それはコメントで述べていますように、この問題を解決するために、あなたはあなたがあなたがそうしているのか分からない限り、任意のプロパティをバインディングで使用するのに適している、いない

public List<Course> GetCourseList 
{ 
    get { return Courses; } 
} 

public List<Course> GetCourseList() 
{ 
    return Courses; 
} 

を変更する必要があります。しかしバインディングについての検索

+1

私のためにそれをクリアしてくれてありがとう。 – johnZep

関連する問題